2

我想调用函数

glShaderSource ::
 GLuint
 -> GLsizei
 -> GHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)
 -> GHC.Ptr.Ptr GLint
 -> IO ()

第三个参数是着色器程序,它是我程序中的一个 Haskell 字符串。如何将 HaskellString转换为 aGHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)以便我可以调用glShaderSource

4

1 回答 1

5

您可以使用withCStringfromForeign.C.String将 Haskell C 字符串转换为临时 C 字符串。该字符串在调用开始时分配并在结束时释放。

withCString s $ \c_string -> let gl_string = castPtr c_string :: Ptr GLchar
                             in glShaderSource a b (foo gl_string) d

强制转换是必要的,因为字符串封送处理函数使用该CChar类型,而 GL 使用该GLchar类型。它们都是 8 位有符号整数,我认为 OpenGL 库和 FFI 将来都不会更改其字符类型。如果您担心指针转换,您可以编写自己的封送处理函数。

关于指针对指针类型:

你现在有一个Ptr GLchar. 制作 a 的正确方法Ptr (Ptr GLchar)取决于 OpenGL 库的预期。例如,它是否需要一个指针数组?它是否需要free一些指针?它会写入其中一些字符串吗?该解决方案可能会涉及一些内存分配和指针复制。

于 2012-07-30T17:50:43.547 回答