我想调用函数
glShaderSource ::
GLuint
-> GLsizei
-> GHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)
-> GHC.Ptr.Ptr GLint
-> IO ()
第三个参数是着色器程序,它是我程序中的Haskell字符串。如何将Haskell String
转换为GHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)
,以便我可以调用glShaderSource
?
答案 0 :(得分:5)
您可以使用withCString
中的Foreign.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
。制作Ptr (Ptr GLchar)
的正确方法取决于OpenGL库所期望的内容。例如,它是否期望一个指针数组?是否会在某些指针上调用free
?它是否写入其中一些字符串?该解决方案可能涉及一些内存分配和指针复制。