2017-08-29 6 views
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に戻すにはどうすればよいですか?

+0

「Foreign.Storable.poke」? – arrowd

+1

なぜ別のポインタを返すのですか? 'ForeignPtr PropertyListT - > IO(ForeignPtr PropertyListT)'は 'property_list_t * read_params_for(property_list_t * props)'のように読みます。後者は 'void'を返すので、代わりに' ForeignPtr PropertyListT - > IO() 'を使います。これには 'newForeignPtr'は必要ありません。 – chi

+0

あなたの関数は単純に書くことができます 'readParamsFor p = withForeignPtr p readParamsFor '>> return p';これがうまくいかない場合は、実装のどこかに問題があります(検証可能な例がないため、その場所を特定することは不可能です)。これは、C関数自体の入力として与えられたポインタを返すことと同じです。 – user2407038

答えて

0

私は使用したいCライブラリにバグがあり、実際にはバグがない場合は単純なwithForeignPtrで十分であることに気付きました。

関連する問題