0

OpenGL を使用してプログラムを作成していますが、問題が発生しました。「Quad」というクラスがあり、問題を引き起こしている 2 つの変数は、パブリック マップとパブリック Vector3 (別のクラス) です。Quad.h で定義されている 2 つの変数を次に示します。

std::map<unsigned int, Vector3*> vertexes;
Vector3* normal;

次のように、Quadコンストラクターで「通常」が開始されます(それが言葉だと思います)。

normal = new Vector3(0,0,0);

マップは次のように追加されます。

vertexes[0] = &vertex;

vertexプレーンな Vector3 であり、マップは Vector3 へのポインターを受け入れるため、そのように参照する必要がありました。

別の関数を使用して Vector3 の正しい値を出力できますが、何らかの理由でこれでセグメンテーション エラーが発生します。

void Quad::draw()
{
    glNormal3f(normal->x, normal->y, normal->z);

    for (std::map<unsigned int, Vector3*>::iterator i = this->vertexes.begin(); i !=   this->vertexes.end(); ++i) {
        glVertex3f(i->second->x, i->second->y, i->second->z);
    }
}

メソッドの内容をコメントアウトしてもエラーは発生しないため、パブリック変数が原因であることはわかっています。cout << normal->x << endl;も障害を引き起こしますが、そうでcout << "Hello World!" << endl;はありません。しかし、この関数とこれの違いは何ですか。

void Quad::calculateNormal()
{
    Vector3 tmp = *vertexes[0];
    tmp = tmp.getFaceNormal(*vertexes[1], *vertexes[2]);
    normal = &tmp;
    std::cout << *normal << std::endl;
}

ここで法線が再定義され、出力されます。で置き換えてもstd::cout << *normal << std::endl;正しいstd::cout << normal->x << std::endl;データが得られますが、他の関数ではそうではありませんか? わかりません。私はそれがばかげていると確信しています(そうであることを願っています)。前もって感謝します。

4

1 に答える 1

4

次のようなコードがある場合:

// Global map of vertices
std::map<unsigned int, Vector3*> vertexes;

void foo()
{
    Vector3 vertex;
    vertexes[0] = &vertex;
}

int main()
{
    foo();
    std::cout << vertexes[0]->x << '\n';
}

次に、未定義の動作を呼び出しています。これは、関数に追加したポインターがfooローカル変数を指しているため、無効になっているためです。

于 2012-08-04T12:54:48.830 に答える