2

ここで何が起こっているのか分かりません。私はVector3Dの標準スタックを持っています(私の家庭教師から与えられた3次元のベクトルクラス)。2つのVector3Dをスタックにプッシュしましたが、vectorStack.top()を使用して一番上のものに移動すると、この非常に役に立たないエラーが発生します。

デバッグアサーションに失敗しました!

式:dequeイテレータは参照解除できません

Vector3Dコピーコンストラクターに何か問題があるのではないかと思いましたが、独自のクイックVector3D構造体(与えられた古い構造体を削除)を作成しようとしましたが、それも機能しません。

コードは次のとおりです。

D3Dapp.cpp
if (!lsys.initialised)
{
    LSystem::ReproductionRule r1;
    r1.from = 'F';
    r1.to = "F+F-[FFF]";
    lsys.rules.push_back(r1);

    LSystem::ReproductionRule r2;
    r2.from = 'F';
    r2.to = "FF";
    lsys.rules.push_back(r2);

    lsys.result = lsys.generateResult("F", 0, 5);
    lsys.currentPosition = Vector3D(0.0f,0.0f,0.0f);
    lsys.vectorStack.push(lsys.currentPosition);

    lsys.initialised = true;
}

  lsys.result = "[FF]+FF";

if (!lsys.complete)
{
    for (int i=0; i < lsys.result.length();i++)
    {
  // F move forward
        if (lsys.result[i] == 'F')
        {
            float cosAng = cos(lsys.angle);
            float sinAng = sin(lsys.angle);

    Vector3D currentPosition(lsys.vectorStack.top());

            Vector3D newPosition = Vector3D(
                currentPosition.x + (cosAng * 0.5f), 
                currentPosition.y + (sinAng * 0.5f), 
                currentPosition.z);

            //lsys.vectorStack.push(newPosition);

            Vertex s, e;
            s.x = currentPosition.x;
            s.y = currentPosition.y;
            s.z = currentPosition.z;
            e.x = newPosition.x;
            e.y = newPosition.y;
            e.z = newPosition.z;

            startList.push_back(s);
            endList.push_back(e);

            lsys.currentPosition = newPosition;

    // + turn right
        } else if (lsys.result[i] == '+')
        {
            float rdn = 3.141592f / 180.0f;
            lsys.angle = (lsys.angle + 20.0f);

    // - turn left
        } else if (lsys.result[i] == '-')
        {
            float rdn = 3.141592f / 180.0f;
            lsys.angle = (lsys.angle - 20.0f);

    // [ push stack
        } else if (lsys.result[i] == '[')
  {
    lsys.vectorStack.push(lsys.currentPosition);

    // ] pop stack
  } else if (lsys.result[i] == ']')
  {
    lsys.vectorStack.pop();
  }
    }

    lsys.currentPosition = Vector3D(0.0f,0.0f,0.0f);
}

lsys.complete = true;

lsystemのスタックはstack<Vector3D> vectorStack;

vectorStack.top()を現在の位置に割り当てるさまざまな方法を試しましたが、何も機能していないようです。

完全を期すために、Vector3Dのコンストラクターは次のとおりです。

Vector3D.h
Vector3D() {
    x = y = z = 0;
}

Vector3D(double a, double b, double c) {
    x = a;
    y = b;
    z = c;
}

Vector3D(const Vector3D& v) {
    x = v.x;
    y = v.y;
    z = v.z;
}

編集:スタックに何かがあることを証明するため スクリーンショット

これは、エラーをスローするスタック内の行です スクリーンショット2

4

2 に答える 2

1

そのような問題を引き起こすと私が考えることができる2つの方法だけがあります。1つ目は、プログラムのどこかにメモリの破損があることです。これは可能性がありますが、他のオプションを削除した後でのみ検討する必要があります。

2番目のオプションは、スタックが実際には空であるということです。スクリーンショットにはスタックの内部サイズは表示されていません。ある時点で2つのアイテムにメモリが割り当てられ、スタックにプッシュされたことが示されています。ほとんどの場合、これらのアイテムをポップして、スタックは空ですが、それでも一見有効なメモリを指しています。を呼び出す前にcout印刷するだけでなく、スタックにプッシュとポップでいくつかのsを置くだけで、これを証明または反証することができます。lsys.vectorStack.size()top

于 2012-12-04T22:35:15.277 に答える
0

私が使用している(強制的に使用されている)フレームワークは、非常に厳しいメモリ要件を念頭に置いて構築されていることがわかりました。この量のメモリとこの量のメモリのみを割り当てるように見えるZeroMemoryへの呼び出しがいくつかあります。

したがって、スタックやベクトルなどの動的メモリ構造の負荷を追加し始めると、すべてが地獄に落ちます。

ZeroMemory( this, sizeof(D3dApp) )

その後、上記を削除した後もまだいくつかの問題がありましたが、Mark Bのアドバイスに従い、現在は稼働しています。

どうもありがとう。

于 2012-12-05T12:50:55.657 に答える