当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何在结构上使用Haskell的FFI?》经验,为你挑选了2个好方法。

我创建了以下用于读取图像的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文件,仅此而已(并且当然它无法编译).



1> Norman Ramse..:

FFI的基本支持仅包括标量类型.你最后用地址算法做的其他事情.FFI文档中有关外来类型的部分提供了基础知识,您可以在FFI Cookbook中找到一个示例.

有一段时间,您可以使用Green Card和H/Direct等工具为您生成编组和解组代码.由于我不明白的原因,这些工具在很长一段时间内都没有更新.据我所知,目前的选择工具是hsc2hs.


编辑:如评论中所述(感谢ephemient),c2hs也很受欢迎,因为c2hs来自Manuel Chakravarty,它很可能是好的.


我过去使用过c2hs(http://www.cse.unsw.edu.au/~chak/haskell/c2hs/),在我看来,这是(a)仍然保持和(b)比hsc2hs更容易.

2> Curt J. Samp..:

听起来好像你有构建问题; 我似乎记得当我在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)或等等.

(如果您真的想看看生成的内容,或者需要帮助进行构建,请发送电子邮件给我,我会帮助您.)

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有