18

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

4

3 回答 3

10

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

有一次,您可以使用Green CardH/Direct等工具为您生成编组和解组代码。由于我不明白的原因,这些工具已经很长时间没有更新了。据我所知,当前选择的工具是hsc2hs.


编辑:正如评论中所述(感谢 ehemient),c2hs它也很受欢迎,并且由于c2hs来自 Manuel Chakravarty,它可能会很好。

于 2009-03-22T03:36:47.817 回答
7

听起来好像您有构建问题;我似乎确实记得,当我将 FFI 接口写入 Windows Win32 DDEML 库时,我使用了您引用的页面作为示例。例如,我们使用的结构之一是

typedef struct tagHSZPAIR {
    HSZ     hszSvc;
    HSZ     hszTopic;
} HSZPAIR, *PHSZPAIR;

#include "ddeml.h"将其带入DDEML.hsc文件。我们通过以下方式访问它:

数据 HSZPair = HSZPair HSZ HSZ
实例 Storable HSZPair where
    sizeOf _ = (#size HSZPAIR)
    对齐 = sizeOf
    peek ptr = do svc <- (#peek HSZPAIR, hszSvc) ptr
                                      主题 <- (#peek HSZPAIR, hszTopic) ptr
                                      返回 $ HSZPair svc 主题
    poke ptr (HSZPair svc 主题) = do (#poke HSZPAIR, hszSvc) ptr svc
                                      (#poke HSZPAIR, hszTopic) ptr 主题

不幸的是,我目前无法向您展示它编译成什么,因为我手边没有 Windows 框,但生成的代码与上面一样,除了#size HSZPAIR替换为(64)或其他等等。

(如果您真的想查看生成的内容,或者在构建过程中需要帮助,请给我发电子邮件,我会为您提供帮助。)

于 2009-05-19T14:01:50.547 回答
-3

Hackage 有几个使用 FFI 的软件包,您可以查看这些软件包作为示例。

于 2009-03-22T00:00:28.820 回答