2

関数を呼び出したい

glShaderSource ::
 GLuint
 -> GLsizei
 -> GHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)
 -> GHC.Ptr.Ptr GLint
 -> IO ()

3 番目の引数はシェーダー プログラムで、私のプログラムでは Haskell 文字列です。StringHaskellをに変換しGHC.Ptr.Ptr (GHC.Ptr.Ptr GLchar)て を呼び出せるようにするにはどうすればよいglShaderSourceですか?

4

1 に答える 1

5

withCStringfromを使用しForeign.C.Stringて、HaskellC文字列を一時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いくつかのポインタを必要としますか?それらの文字列のいくつかに書き込みますか?この解決策には、おそらくある程度のメモリ割り当てとポインタのコピーが含まれます。

于 2012-07-30T17:50:43.547 に答える