Dan*_*l O 18 haskell ffi word-wrap
我创建了以下用于读取图像的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);
Run Code Online (Sandbox Code Playgroud)
我无法使用外部函数接口使用数组和结构找到任何信息.我如何才能在Haskell中使用我的库?
我尝试使用以下示例作为基础:http://therning.org/magnus/archives/315然后将hsc文件编译为仅包含上述c代码的hs文件,仅此而已(并且当然它无法编译).
Nor*_*sey 10
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;
Run Code Online (Sandbox Code Playgroud)
#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)或等等.
(如果您真的想看看生成的内容,或者需要帮助进行构建,请发送电子邮件给我,我会帮助您.)