1

NSStringsよりもC文字列を好むOpenGLシェーダーを使用していますが、次のような奇妙なことに遭遇しました。

関連する事実は

1)shaderSourceは次のように定義されます

NSString* shaderSource

2)glShaderSourceの署名は

glShaderSource(GLuint shader, GLuint count, const GLchar** string, const GLint *length)

これは機能します:

int len = [shaderSource length];
const char *cstr = [shaderSource UTF8String];
glShaderSource(shader, 1, &cstr, &len);

これは動作しません:

glShaderSource(shader, 1, &[shaderSource UTF8String], &[shaderSource length]);

私はここでObjectiveCについて何かを明らかに理解していません、そして私はその問題を修正したいと思います、それであなたがそんなに傾いているなら、祈ってください、WTF?

4

1 に答える 1

5

ポインタへのポインタ&[shaderSource UTF8String]が必要なため、タイプが正しくなるように、追加レベルの間接参照を提供するために使用しているようです。しかし、何かの前に置いて、それへのポインタを取得するglShaderSourceことはできません。&

&x「xのアドレスを返す」を意味します。それが意味をなすためxには、表現ではなく記号でなければなりません。あなたが書くことができない&[shaderSource UTF8String]のと同じ理由であなたは書くことができません&(1 + t)。これは単なる式であり、値をどこかに格納する必要があります。そうしないと、アドレス(格納した場所)を渡すことができます。

これは、C構造体に慣れている場合は混乱する可能性があります。これは、メンバーを持つ構造体がある場合、fooを記述することでメンバーのアドレスを取得できるbarためです。しかし、Objective-Cオブジェクトは構造体ではありません(技術的には不透明な構造体です)。メッセージを送信することでプロパティ値を取得します。これは基本的に関数呼び出しと同じです。したがって、がオブジェクトであり、がプロパティである場合(これは実際にはの省略形です)は無効な式です。&foo.barfoobar&foo.bar&[foo bar]

于 2012-07-02T02:57:12.597 に答える