Как мне использовать FFI от Haskell для структур?

StackOverflow https://stackoverflow.com/questions/670221

  •  21-08-2019
  •  | 
  •  

Вопрос

Я создал следующую библиотеку 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 которые вы могли бы посмотреть в качестве примеров.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top