0
I持って、私はHaskell
から呼び出したいC
機能以下:HaskellのFFI - リターン更新構造
void read_params_for (property_list_t *props);
機能がいくつかproperty_list_t
を受信し、その中にいくつかの値を移入することになって、その呼び出し側が、その後持ってい更新された構造。
私は(Storable
、などなど)property_list_t
ために必要なすべてのラッパーを持っていますが、私はまた、私はC2HS
を使用してみました
readParamsFor :: ForeignPtr PropertyListT -> IO (ForeignPtr PropertyListT)
のようなものには、この機能をラップする方法を見つけ出すことはできず、
foreign import ccall "read_params_for"
readParamsFor' :: Ptr PropertyListT -> IO()
readParamsFor :: ForeignPtr PropertyListT -> IO (ForeignPtr PropertyListT)
readParamsFor ps = do
withForeignPtr ps $ \ps' -> do
res <- readParamsFor' ps'
pl <- newForeignPtr propertyListDestroy ps'
return pl
しかし、どちらの場合でも、私は元の "不足している"リストを取り戻しています。
更新された構造をHaskellに戻すにはどうすればよいですか?
「Foreign.Storable.poke」? – arrowd
なぜ別のポインタを返すのですか? 'ForeignPtr PropertyListT - > IO(ForeignPtr PropertyListT)'は 'property_list_t * read_params_for(property_list_t * props)'のように読みます。後者は 'void'を返すので、代わりに' ForeignPtr PropertyListT - > IO() 'を使います。これには 'newForeignPtr'は必要ありません。 – chi
あなたの関数は単純に書くことができます 'readParamsFor p = withForeignPtr p readParamsFor '>> return p';これがうまくいかない場合は、実装のどこかに問題があります(検証可能な例がないため、その場所を特定することは不可能です)。これは、C関数自体の入力として与えられたポインタを返すことと同じです。 – user2407038