0

値を変更する関数に提供される引数に問題があります。

scene->shader->start( scene->shader->dataStart );
printf("%d\n",(int)scene->shader->dataStart);

次に、シーン -> シェーダー -> 開始内で、それを出力します。

printf("%d\n",(int) _data );

Scene->shader->start を呼び出した場所からメモリ アドレスを出力し、関数内では 0 を出力します。構造体の内部からポインタで関数を呼び出しているという事実と何か関係がありますか? 関数の printf() はその関数の最初の行であるため、まったく意味がありません。そのため、どこにも 0 を設定していません。エルクリングさん、助けていただければ幸いです。

編集:

void shader1_setdown(void *);

typedef struct {
    GLuint shaderProgram;
    void *dataStart;
    void *dataEnd;
    void (*start)(void *data);
    void (*end)(void *data);
} renderShader;

「シーン」構造には renderShader* が含まれています。

4

1 に答える 1

2

アンダースコアで始まる識別子を使用して、実装の名前空間に侵入している可能性があります。これにより、C 言語標準に従って未定義の動作が発生する可能性があります。特に_begin_end_data、は_bss_textメモリの特定のセグメントをアドレス指定するために一部の実装で使用されます。

アンダースコアで始まらないように識別子を変更します。

別の可能性: %d を int として使用してアドレスを出力することはできません。特に、ポインターの型がint. これにより、 がゼロと表示される理由が説明されますint。ポインターが 64 ビットのビッグエンディアンで、int が 32 ビットであるとします。ポインターの上位 32 ビット (おそらくすべてゼロ) が int として解釈されます。

アドレスを printf する標準的な正しい方法は次のとおりです (非 void-ptrs にはキャストが必要です)。

printf ("%p\n", (void *)ptr);
于 2013-03-14T16:46:07.010 に答える