2012-07-30 68 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

相關問題