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);

配列と構造体をForeignFunctionInterfaceで使用して情報を実際に見つけることはできません。Haskellで自分のライブラリを使用できるようにするにはどうすればよいですか?

次の例をベースとして使用しようとしました:http://therning.org/magnus/archives/315しかし、hscファイルは、上記のcコードのみを含み、それ以上のものを含まないhsファイルにコンパイルされました。もちろんコンパイルできません)。

4

3 に答える 3

10

基本的な FFI サポートには、スカラー型のみが含まれます。アドレス演算で行うその他すべて。FFI ドキュメンテーションの外部型に関するセクションで基本が説明されており、 FFI クックブックで例を見つけることができます。

かつては、 Green CardH/Directなどのツールを使用して、マーシャリングおよびアンマーシャリング コードを生成できました。理由はわかりませんが、これらのツールは長い間更新されていません。私が知る限り、現在選択されているツールはhsc2hs.


編集: コメントで指摘されているように (感謝の気持ち)c2hsも人気があり、c2hsManuel Chakravarty からのものなので、おそらく良いでしょう.

于 2009-03-22T03:36:47.817 に答える
7

ビルドに問題があるようです。Windows Win32 DDEML ライブラリに FFI インターフェイスを記述していたときに、あなたが参照したまさにそのページを例として使用したことを思い出すようです。たとえば、私たちが使用する構造の 1 つは

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

#include "ddeml.h"これをDDEML.hscファイルに取り込みます。次の方法でアクセスします。

データ HSZPair = HSZPair HSZ HSZ
instance Storable HSZPair ここで
    sizeOf _ = (#サイズ HSZPAIR)
    配置 = sizeOf
    peek ptr = do svc <- (#peek HSZPAIR, hszSvc) ptr
                                      トピック <- (#peek HSZPAIR, hszTopic) ptr
                                      $ HSZPair サービス トピックを返す
    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 に答える