如何调用Ptr GLubyte类型的函数 - > Haskell中的IO()

时间:2011-07-07 20:45:44

标签: opengl haskell ffi

在OpenGL Raw库中有以下功能:

glPolygonStipple :: Ptr GLubyte -> IO ()

此函数的C对应接受指向数组的指针,但如何在Haskell程序中使用数组/列表调用此函数?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在这种情况下,最好的方法是在矢量包中存储矢量[http://hackage.haskell.org/packages/archive/vector/0.7.1/doc/html/Data-Vector-Storable.html ] [1]。包为不可变和可变向量提供丰富的接口,因此不必在IO monad中创建向量。除了列表是链表和转换到数组inovlve复制

您的特定示例可能看起来像

let myVector = fromList [1,2,3,4] 
in unsafeWith myVector glPolygonStipple