にOpenGLの生ライブラリの次の関数である:どのタイプのPtr GLubyteの関数を呼び出す - > IO()ハスケル
glPolygonStipple :: Ptr GLubyte -> IO()
この関数へのCの対応が配列へのポインタを受け入れ、しかしどのように私はHaskellプログラムの配列/リストでこの関数を呼び出すことができますか?
にOpenGLの生ライブラリの次の関数である:どのタイプのPtr GLubyteの関数を呼び出す - > IO()ハスケル
glPolygonStipple :: Ptr GLubyte -> IO()
この関数へのCの対応が配列へのポインタを受け入れ、しかしどのように私はHaskellプログラムの配列/リストでこの関数を呼び出すことができますか?
あなたはそれにあなたのリストを置くためにメモリとpokeArrayを割り当てるためにmallocArrayを使用します:よう
何か:
do
arrayOfGLuBytes <- (mallocArray 15) :: IO (Ptr GLubyte)
pokeArray arrayOfGLuBytes [1,2,3,4]
glPolygonStipple arrayOfGLuBytes
free arrayOfGLuBytes -- free from Foreign.Marshall.Alloc
完了したら、あなたは 'Foreign.Marshall.Alloc.free arrayOfGLuBytes'を実行する必要があると思います。 (OpenGLが渡された配列の所有権を持っているかどうかは確かではありませんが、その場合はこのコメントを無視してください) – Lambdageek
はい、あなたは正しいです:) ありがとうございます。ハスケルコードの中でCを考えると、時にはCのlowlevelスタイルをバイパスします。 – Gabriel
ベストは 'allocaArray'を使うことです。 – alternative
は、おそらくこのような状況に行くための最良の方法は保存可能ですベクトルパッケージ[http://hackage.haskell.org/packages/archive/vector/0.7.1/doc/html/Data-Vector-Storable.html] [1]のベクトル。パッケージは不変ベクトルと可変ベクトルの両方に豊富なインタフェースを提供するので、IOモナド内にベクトルを作成する必要はありません。リストはあなたが
をコピーinovlve配列に特定の例リストとの変換をリンクされているほか
let myVector = fromList [1,2,3,4]
in unsafeWith myVector glPolygonStipple
のように見える可能性おそらくhttp://www.haskell.org/hoogle([これらの機能の1]を必要があります/?hoogle =%28Ptr + a + - %3E + IO + b%29 + - %3E + IO + b)。おかげさまで – hammar
私が思いついたコード:withStorableArray xs glPolygonStipple – Eric