2012-07-30 45 views
2

我想调用的函数如何将Haskell字符串转换为Ptr(Ptr GLchar)?

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

@DavidJohnson:通常我会同意。但这是相当深奥的,一般来说,如果你知道从哪里开始,你就不必问。 – 2012-07-30 19:59:35

回答

5

您可以使用Foreign.C.StringwithCString将Haskell C字符串转换为临时C字符串。该字符串在调用开始时分配并在结束时释放。因为字符串编组功能使用CChar类型,而GL采用GLchar

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

演员是必要的。它们都是8位有符号整数,并且我认为,未来OpenGL库和FFI都不会改变它的字符类型。如果你关心指针转换,你可以编写你自己的编组函数。

在指针到指针类型:

您现在有一个Ptr GLchar。制作Ptr (Ptr GLchar)的正确方法取决于OpenGL库的期望。例如,它是否期望一个指针数组?它是否在某些指针上调用free?它是否写入一些字符串?该解决方案可能会涉及一些内存分配和指针复制。

+1

它是一个字符串数组,它不释放它们。关于['glShaderSource'可以在这里获得的信息]的完整信息(http://www.opengl.org/wiki/GLAPI/glShaderSource) – 2012-07-30 19:58:32

相关问题