如何在结构上使用Haskell的FFI?

时间:2009-03-21 23:34:31

标签: haskell wrapping ffi

我创建了以下用于读取图像的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文件,而且当然不能编译)。

3 个答案:

答案 0 :(得分:10)

基本的FFI支持仅包括标量类型。你最后用地址算法做的其他事情。 FFI文档中的section on foreign types提供了基础知识,您可以在FFI Cookbook中找到示例。

您曾经可以使用Green CardH/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)