11

もちろん、答えは連続したメモリブロックを何らかの形で受け渡しすることなので、問題はそれをどのように行うかについてです。今のところ、C 側でラッパー関数を作成することで問題を回避できますが、それは永続的な解決策ではありません。

4

1 に答える 1

15

FFI は、Haskell の格納可能な型による任意の値渡しをサポートしていません。

タイプの値のみを渡すことができます (これらのいくつかはポインターです):

Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.

したがって、構造体を渡すには、C ラッパーを介して呼び出しをラップする必要があります。これはポインターを取り、その値を実際に呼び出したい C 関数に渡します。

最近の GHC 拡張では、「primop」インポートが可能になりました。これは、FFI メカニズムをバイパスし、任意の呼び出し規則と、ボックス化されていないタプルを介した構造の受け渡しをサポートします。例えば

foreign import prim "ITCHv41_run"
  parseITCHv41# :: Addr# -> Word#
                -> (# Int#, Word#, Word#, Word#, Word#, Word# #)

これらを使用して、このようなトリッキーな低レベルのことを行うことができます。

于 2012-06-05T20:24:51.900 に答える