Opengl 如何将Haskell字符串转换为Ptr(Ptr GLchar)?
我想调用这个函数Opengl 如何将Haskell字符串转换为Ptr(Ptr GLchar)?,opengl,haskell,ffi,Opengl,Haskell,Ffi,我想调用这个函数 glShaderSource :: GLuint -> GLsizei -> GHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar) -> GHC.Ptr.Ptr GLint -> IO () 第三个参数是着色器程序,它是我程序中的Haskell字符串。如何将Haskell字符串转换为GHC.Ptr.Ptr(GHC.Ptr.Ptr GLchar),以便调用glShaderSource?您可以使用with cstringfromFor
glShaderSource ::
GLuint
-> GLsizei
-> GHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)
-> GHC.Ptr.Ptr GLint
-> IO ()
第三个参数是着色器程序,它是我程序中的Haskell字符串。如何将Haskell
字符串转换为GHC.Ptr.Ptr(GHC.Ptr.Ptr GLchar)
,以便调用glShaderSource
?您可以使用with cstring
fromForeign.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
?它会写入其中一些字符串吗?解决方案可能会涉及一些内存分配和指针复制。这是一个字符串数组,不会释放它们。关于@DavidJohnson期望得到什么的完整信息:通常,我同意。但这是相当深奥的,一般来说,如果你知道从哪里开始,你就不用问了。