2016-12-31 8 views

答えて

3
など、私はいくつかのHaskellの型ではポインタとサイズを包むことができますが、私はHaskellでリストと協力したいと思い、それを印刷し、JSONでエンコード

Cコードから配列へのポインタを返し、peekArrayを使用してリストにマーシャリングします。

import Foreign.Marshal.Array 
import Language.C.Inline 

foo :: Int -> IO [Int] 
foo size = [exp| int* { calloc($(int size), sizeof(int)) }] >>= peekArray size 

peekArrayは、読み込むポインタ引数と要素の数を受け入れます。それは、ポインタsizeを繰り返しインクリメントし、型のStorableインスタンス(この場合はInt)を使用して配列から要素を引き出します。

turn your array into an unboxed Vectorより効率的です。

+0

データがコピーされ、割り当てられたメモリを解放できると想定するのは安全でしょうか? – Igor

+1

@Igor 'peekArray'で、はい。 'unsafeFromForeignPtr'では、noです。 –

+1

@Igor PS、[mallocとHaskellのバインディングはすでに存在します](https://hackage.haskell.org/package/base-4.9.0.0/docs/Foreign-Marshal-Array.html#v:callocArray) 。 –

関連する問題