Как мне использовать FFI от Haskell для структур?
Вопрос
Я создал следующую библиотеку C для чтения изображения:
typedef struct {
unsigned int height;
unsigned int width;
unsigned char* red; //length=height*width
unsigned char* green;
unsigned char* blue;
} Contents;
Contents readJPEGFile(const char* inFilename);
Я действительно не могу найти никакой информации, используя массивы и структуры с интерфейсом внешней функции.Как мне поступить, чтобы иметь возможность использовать свою библиотеку в Haskell?
Я попытался использовать следующий пример в качестве основы: http://therning.org/magnus/archives/315 но затем файл hsc был скомпилирован до файла hs, который содержал только приведенный выше c-код и ничего больше (и, конечно, он не может быть скомпилирован).
Решение
Звучит так, как будто у вас проблема со сборкой;Кажется, я припоминаю, что использовал ту самую страницу, на которую вы ссылаетесь, в качестве примера, когда писал интерфейс FFI в библиотеку DDEML Windows Win32.Например, одной из используемых нами структур является
typedef struct tagHSZPAIR {
HSZ hszSvc;
HSZ hszTopic;
} HSZPAIR, *PHSZPAIR;
#include "ddeml.h"
приводит это к DDEML.hsc
файл.Мы получаем к нему доступ с помощью:
data HSZPair = HSZPair HSZ HSZ instance Storable HSZPair where sizeOf _ = (#size HSZPAIR) alignment = sizeOf peek ptr = do svc <- (#peek HSZPAIR, hszSvc) ptr topic <- (#peek HSZPAIR, hszTopic) ptr return $ HSZPair svc topic poke ptr (HSZPair svc topic) = do (#poke HSZPAIR, hszSvc) ptr svc (#poke HSZPAIR, hszTopic) ptr topic
К сожалению, я не могу показать вам, для чего это компилируется в данный момент, потому что у меня нет под рукой окна Windows, но сгенерированный код был таким же, как указано выше, за исключением #size HSZPAIR
заменен на (64)
или что-то еще, и так далее.
(Если вы действительно хотите посмотреть, что было сгенерировано, или вам нужна помощь в сборке, напишите мне по электронной почте, и я вам помогу.)
Другие советы
Базовая поддержка FFI включает в себя только скалярные типы.Все остальное вы в конечном итоге делаете с помощью адресной арифметики.Тот Самый раздел, посвященный иностранным типам в документации FFI приведены основы, и вы можете найти пример в Кулинарная книга FFI.
Когда-то вы могли бы использовать такие инструменты, как Зеленая карта и H/Прямой сгенерировать для вас код маршалинга и отмены маршалинга.По причинам, которые я не понимаю, эти инструменты долгое время не обновлялись.Насколько я могу судить, текущий инструмент выбора - это hsc2hs
.
Редактировать:Как отмечено в комментарии (спасибо эфемерное), c2hs
также популярен, и с тех пор c2hs
от Мануэля Чакраварти это, скорее всего, будет хорошо.
У Hackage есть несколько пакетов, которые используют FFI которые вы могли бы посмотреть в качестве примеров.