2011-07-07 4 views
4

にOpenGLの生ライブラリの次の関数である:どのタイプのPtr GLubyteの関数を呼び出す - > IO()ハスケル

glPolygonStipple :: Ptr GLubyte -> IO() 

この関数へのCの対応が配列へのポインタを受け入れ、しかしどのように私はHaskellプログラムの配列/リストでこの関数を呼び出すことができますか?

+0

のように見える可能性おそらくhttp://www.haskell.org/hoogle([これらの機能の1]を必要があります/?hoogle =%28Ptr + a + - %3E + IO + b%29 + - %3E + IO + b)。おかげさまで – hammar

+0

私が思いついたコード:withStorableArray xs glPolygonStipple – Eric

答えて

5

あなたはそれにあなたのリストを置くためにメモリとpokeArrayを割り当てるためにmallocArrayを使用します:よう

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Foreign-Marshal-Array.html#v:mallocArray

何か:

do 
    arrayOfGLuBytes <- (mallocArray 15) :: IO (Ptr GLubyte) 
    pokeArray arrayOfGLuBytes [1,2,3,4] 
    glPolygonStipple arrayOfGLuBytes 
    free arrayOfGLuBytes -- free from Foreign.Marshall.Alloc 
+0

完了したら、あなたは 'Foreign.Marshall.Alloc.free arrayOfGLuBytes'を実行する必要があると思います。 (OpenGLが渡された配列の所有権を持っているかどうかは確かではありませんが、その場合はこのコメントを無視してください) – Lambdageek

+0

はい、あなたは正しいです:) ありがとうございます。ハスケルコードの中でCを考えると、時にはCのlowlevelスタイルをバイパスします。 – Gabriel

+3

ベストは 'allocaArray'を使うことです。 – alternative

0

は、おそらくこのような状況に行くための最良の方法は保存可能ですベクトルパッケージ[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 
関連する問題