2009-03-21 4 views
15

я создал следующую библиотеку C для считывания изображения:Как использовать FFI Haskell для структур?

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-код и ничего больше (и, конечно же, он не может быть скомпилирован) ,

ответ

5

Звучит так, как будто у вас проблема сборки; Я действительно напоминаю, что я использовал ту самую страницу, которую вы ссылаетесь в качестве примера, когда я писал интерфейс FFI в библиотеке Windows Win32 DDEML. Например, одна из структур мы используем

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) или что-то еще и так далее.

(Если вы действительно хотите увидеть, что был сгенерирован, или нужна помощь делает вашу сборку, по электронной почте мне, и я помогу вам.)

9

Основная поддержка FFI включает только скалярные типы. Все остальное вы завершаете с арифметикой адреса. section on foreign types в документации FFI дает основы, и вы можете найти пример в FFI Cookbook.

В свое время вы могли использовать такие инструменты, как Green Card и H/Direct, чтобы генерировать код маршаллинга и развязывания для вас. По причинам, которые я не понимаю, эти инструменты не обновлялись в течение длительного времени. Насколько я могу судить, текущий инструмент выбора - hsc2hs.


Edit: Как было отмечено в комментарии (спасибо ephemient) c2hs также популярен, и с тех пор c2hs от Manuel Чакраварти это, вероятно, будет хорошо.

+2

Я использовал c2hs (http://www.cse.unsw.edu.au/~chak/haskell/c2hs/) в прошлом, который (а) все еще поддерживается и (б) проще, чем hsc2hs, в моем мнение. – ephemient

+0

c2hs - отличный инструмент, но не способен управлять перечислениями или объединениями – ChrisQuignon

+0

Существует также 'c2hsc', для создания файлов hsc в основном автоматически из файлов заголовков C. –

Смежные вопросы