-1

シェーダー コード ファイルからテキストを読み込む関数を作成しています。ポインターに関して奇妙なことに遭遇しましたが、その理由がわかりません。

Loadという名前の関数があります。この関数では、ファイル ストリームから取得したテキストを出力変数にコピーします。

static void Load(const GLchar* source_path,  GLchar* output,GLint& count )
{
    string code;

    // loading logic here
    code= vShaderStream.str(); // copying the string from the stream
    count = code.length(); 
    output = new GLchar[count];
    std::size_t length = code.copy(output, count, 0);
    output[length]= '\0';
}

Loadは次のように呼び出されます。

for (size_t i = 0; i < d_n_fragment; i++)
{
    Load(d_fragment_source_path, d_fragment_code[i], d_fragment_string_count[i]);
} 

ここで、d_fragment_codeは、既に初期化されている Glchar** の double ポインターです。Load 関数が呼び出された後、ポインタd_fragment_code[i]にはテキストが含まれていません。Load 関数のシグネチャを次のように変更しようとしました。

static void Load(const GLchar* source_path,  GLchar*& output,GLint& count )

したがって、ポインターを参照渡しします。関数が呼び出された後、d_fragment_codeはファイルからロードされたテキストを正しく保持しますが、ポインターが参照によって渡される理由がわかりません。

その内容を変更するには、ポインターを渡すだけで十分だと思いました。私は混乱しています、あなたはそれに光を当てることができますか?

4

3 に答える 3

3
output = new GLchar[count];

これにより、何outputを指すかが変わります。outputがすでに十分なサイズのバッファーを指していることが確実な場合は、この行を削除してください。

于 2015-01-30T13:04:34.377 に答える
2

その内容を変更するには、ポインターを渡すだけで十分だと思いました。

ポインターを渡すだけで、指示先 (指している対象) の内容を変更できます。これは素晴らしいことであり、本質的に参照を渡すのと同じ効果があります。

しかし、あなたはそうしていません。ポインタ自体を変更したい。

関数が元のオブジェクトを変更するような関数にオブジェクトを渡したい場合を考えてみてください。オブジェクトの型 T を呼び出して、なんらかの方法でそれを変更するメンバー関数があると仮定しましょうmutate(変更の実際の例を示す必要がないようにT)。

void foo(T& handle)
{
   handle.mutate();
}

void bar(T* handle)
{
   handle->mutate();
}

int main()
{
   T obj;
   foo(obj);
   bar(&obj);
}

fooとはbar、それぞれ参照とポインターを使用して同じことを達成します。

これで、さまざまな型を に交換することで、このロジックをあらゆるものに適用できますTあなたが考えているシナリオは、ポインターではないオブジェクトを渡して、それを変更することです。

void bar(int* handle)
{
   handle->mutate();
}

int main()
{
   int obj;
   bar(&obj);
}

しかし、あなたが実際にいる状況では、Tそれ自体がポインターであり、 .fooではなく使用する必要がありbarます。これが紛らわしいのは理解できます!

void foo(GLint*& handle)
{
   handle.mutate();
}

int main()
{
   GLint* obj;
   foo(obj);
}

それが役立つ場合は、次のように書くこともできます。

void bar(GLint** handle)
{
   handle->mutate();
}

int main()
{
   GLint* obj;
   bar(&obj);
}

これは事実上同等です。

(免責事項:objこれらの例では初期化していません。必要になるでしょう。)

于 2015-01-30T13:01:42.377 に答える