我创建了以下用于读取图像的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文件,仅此而已(并且当然它无法编译).
FFI的基本支持仅包括标量类型.你最后用地址算法做的其他事情.FFI文档中有关外来类型的部分提供了基础知识,您可以在FFI Cookbook中找到一个示例.
有一段时间,您可以使用Green Card和H/Direct等工具为您生成编组和解组代码.由于我不明白的原因,这些工具在很长一段时间内都没有更新.据我所知,目前的选择工具是hsc2hs
.
编辑:如评论中所述(感谢ephemient),c2hs
也很受欢迎,因为c2hs
来自Manuel Chakravarty,它很可能是好的.
听起来好像你有构建问题; 我似乎记得当我在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
替换为(64)
或等等.
(如果您真的想看看生成的内容,或者需要帮助进行构建,请发送电子邮件给我,我会帮助您.)