2011-07-07 31 views
4

在OpenGL的原始庫是以下功能:如何呼叫類型PTR GLubyte的函數 - > IO()在Haskell

glPolygonStipple :: Ptr GLubyte -> IO() 

的C語言的該函數接受的指針數組,但我怎麼能在Haskell程序中用數組/列表調用這個函數?

+0

你可能需要[這些功能之一(http://www.haskell.org/hoogle/hoogle =%28Ptr + A + - ?%3E + IO + b%29 + - %3E + IO + b)。 – hammar

+0

謝謝。代碼我想出來:withStorableArray xs glPolygonStipple – Eric

回答

5

您將使用mallocArray分配內存和pokeArray把你的名單分成它:

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語言思考Haskell代碼有時會讓我們繞過C的低級風格。 – Gabriel

+3

最好是使用'allocaArray'。 – alternative

0

也許最好的辦法在這種情況下,走的是可儲存矢量包中的矢量[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