Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何将Haskell字符串转换为Ptr(Ptr GLchar)?_Opengl_Haskell_Ffi - Fatal编程技术网

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
from
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
?它会写入其中一些字符串吗?解决方案可能会涉及一些内存分配和指针复制。

这是一个字符串数组,不会释放它们。关于@DavidJohnson期望得到什么的完整信息:通常,我同意。但这是相当深奥的,一般来说,如果你知道从哪里开始,你就不用问了。