Подключение библиотеки FANN

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Подключение библиотеки FANN

Сообщение archer »

Всем привет!

Возникла необходимость распознать изображение.
Решил использовать свободную нейросетевую библиотеку FANN
http://leenissen.dk/fann/
Библиотека поставляется в виде DLL и файла хэдера для нее.

Не удается подключить ее к файлу проекта. Может кто-нибудь сталкивался с этим.
Для Delphi на сайте есть все заголовочные файлы.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

archer писал(а):Не удается подключить ее к файлу проекта.

А каким образом Вы её подключали?
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

Подключал я заголовочный файл, и ошибки возникали, например, в этой строчке
function fann_create_standard; external DLL_FILE;
когда я пытаюсь импортировать функцию из dll. Dll прописал в Path и в папке проекта лежит еще копия.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

archer писал(а):...и ошибки возникали, например,...

Я, конечно, понимаю, что Вы потомок белорусских партизан и выпытывать секреты у Вас дело безнадёжное, но всё же, поделитесь текстом ошибки.
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

:) Извиняюсь, я не партизан.

Этот кусочек из файла fann.pas

Код: Выделить всё

implementation
          {$IFDEF VARIABLE_ARGUMENTS}
          function fann_create_standard; external DLL_FILE; 


Такая ошибка синтаксиса.
FANN.pas(813,36) Fatal: Syntax error, ":" expected but ";" found
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Функция должна возвращать результат, всё верно.

В вашем случае варианта два - либо узнать, что возвращает функция и написать что-то типа:

Код: Выделить всё

function fann_create_standard: integer; external DLL_FILE; 


либо заменить функцию на процедуру:

Код: Выделить всё

procedure fann_create_standard; external DLL_FILE; 


Точнее сказать трудно, не зная, что делает именно эта функция.
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

и в том и в другом случае строчка успешно компилится, но таких строчек в файле больше 100,
и все они описаны как функции, которые ничего не возвращают, хотя есть, которые называются
типа get_max_size, например, и они также ничего не возвращают(!).

У меня есть некоторые идеи, по этому поводу, если будет найдено решение, опубликую результат здесь.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Посмотрел на файл, который вы пытаетесь отредактировать... Вся проблема в том, что Делфи поддерживает сокращенное описание функций и процедур в разделе implementation. Вся информация есть выше в этом же файле
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

Да, сегодня буду редактировать, надеюсь заработает.
Аватара пользователя
and
постоялец
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Сообщение and »

Проще поставить в начале файла директиву $MODE DELPHI - тогда можно будет, как и в Delphi, писАть в разделе Implementation сокращённо.
Полные заголовки функций (кстати, в Implementation опущены не только типы возврата, но и параметры) смотрите в Interface.
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

Код: Выделить всё

procedure fann_destroy(Ann: PFann); external DLL_FILE;


FANN.pas(843,19) Error: Calling convention doesn't match forward

Написал ко всем функциям полные заголовки.
Режим тоже поменял, все равно ошибается.
Мне не нужно использовать все функции и процедуры из библиотеки, только около 10 функций, и то, может меньше.
Но без procedure fann_destroy не получится нормально работать с библиотекой.
И не только в этой процедуре возникает ошибка, в некоторых тоже, где фигурирует тип PFann.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

В чём проблема? Объявите её так:

Код: Выделить всё

procedure fann_destroy(Ann: PFann); cdecl;  external DLL_FILE;
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

да, точно, Вы правы.
В большинстве функций теперь нет ошибок, ошибки возникают в функциях, которые не возвращают ничего.

Код: Выделить всё

  function fann_get_num_output(Ann: PFann);cdecl; external DLL_FILE;  

FANN.pas(861,49) Fatal: Syntax error, ":" expected but ";" found

Можно ли переименовать ее в процедуру (везде), будет ли она успешно импортирована из DLL?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

из названия видно, что она должна что-то возвращать! Читайте внимательно исходник.

Добавлено спустя 18 секунд:

Код: Выделить всё

function fann_get_num_output(Ann: PFann): cardinal;cdecl; external DLL_FILE;
archer
незнакомец
Сообщения: 9
Зарегистрирован: 23.10.2010 20:38:40
Откуда: Красноярск

Сообщение archer »

Сейчас проверю.

Код: Выделить всё

function fann_create_standard_array(num_layers: Cardinal; const layers: PCardinal): PFann; cdecl;

Закомментировал "плохие" функции и код выше выдает такую ошибку:
FANN.pas(402,18) Error: Forward declaration not solved "fann_create_standard_array(LongWord,const PCardinal):^TFann; CDecl;"
Исходник не изменял, все описания типов в самом начале, как и полагается.
Ответить