在OpenGL的原始庫是以下功能:如何呼叫類型PTR GLubyte的函數 - > IO()在Haskell
glPolygonStipple :: Ptr GLubyte -> IO()
的C語言的該函數接受的指針數組,但我怎麼能在Haskell程序中用數組/列表調用這個函數?
在OpenGL的原始庫是以下功能:如何呼叫類型PTR GLubyte的函數 - > IO()在Haskell
glPolygonStipple :: Ptr GLubyte -> IO()
的C語言的該函數接受的指針數組,但我怎麼能在Haskell程序中用數組/列表調用這個函數?
您將使用mallocArray分配內存和pokeArray把你的名單分成它:
喜歡的東西:
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語言思考Haskell代碼有時會讓我們繞過C的低級風格。 – Gabriel
最好是使用'allocaArray'。 – alternative
也許最好的辦法在這種情況下,走的是可儲存矢量包中的矢量[http://hackage.haskell.org/packages/archive/vector/0.7.1/doc/html/Data-Vector-Storable.html][1]。 Package爲不可變和可變向量提供了豐富的接口,因此不必在IO monad中創建向量。除了名單鏈表和轉換到陣列inovlve複製
您具體的例子可以看起來像
let myVector = fromList [1,2,3,4]
in unsafeWith myVector glPolygonStipple
你可能需要[這些功能之一(http://www.haskell.org/hoogle/hoogle =%28Ptr + A + - ?%3E + IO + b%29 + - %3E + IO + b)。 – hammar
謝謝。代碼我想出來:withStorableArray xs glPolygonStipple – Eric