我创建了以下用于读取图像的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文件编译为仅包含上述c代码的hs文件,而且当然不能编译)。
答案 0 :(得分:10)
基本的FFI支持仅包括标量类型。你最后用地址算法做的其他事情。 FFI文档中的section on foreign types提供了基础知识,您可以在FFI Cookbook中找到示例。
您曾经可以使用Green Card和H/Direct等工具为您生成编组和解组代码。由于我不明白的原因,这些工具在很长一段时间内都没有更新。据我所知,当前选择的工具是hsc2hs
。
编辑:正如评论中所述(感谢ephemient),c2hs
也很受欢迎,因为c2hs
来自Manuel Chakravarty,所以很可能会很好。
答案 1 :(得分:6)
听起来好像你有构建问题;我似乎记得当我在Windows Win32 DDEML库中编写FFI接口时,我使用了您引用的页面作为示例。例如,我们使用的结构之一是
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
替换为{{1等等等等。
(如果您真的想看看生成的内容,或者需要帮助进行构建,请发送电子邮件给我,我会帮助您。)
答案 2 :(得分:-3)