2012-12-04 45 views
2

不知道這裏發生了什麼。我有一個Vector3D的標準棧(我的導師給我的一個三維矢量類)。我已經將兩個Vector3D推到了堆棧上,但是當我用vectorStack.top()去到最頂層的時候,我被視爲非常無用的錯誤:'迭代器不可忽略'C++堆棧

調試斷言失敗!

表達:deque的迭代器不dereferenceble

我想也許有一些毛病的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; 

在l系統堆棧只是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; 
} 

編輯:爲了證明有東西在堆棧 screenshot

這是在堆棧中拋出錯誤的行 screenshot2

+2

如果您在調用'top'時收到該消息,表明您的容器已空。 –

+0

我已經突然接到電話,並且自己檢查了堆棧中有2個Vector3D。相信我! – BouncingCzech

+0

@BouncingCzech:如果你是對的,那麼你不需要在這裏發表一個問題。; - ] – ildjarn

回答

0

事實證明我正在使用的框架(被迫使用)是考慮到非常嚴格的內存需求而建立的,有幾個對ZeroMemory的調用似乎分配了這個內存量和這個內存量。

因此,當我開始添加一個像堆棧和向量這樣的動態內存結構的負載時,一切都會變得很糟糕。

ZeroMemory(this, sizeof(D3dApp)) 

之後,刪除上述我仍然有一些問題,但我遵循馬克B的建議,現在它的啓動和運行。

非常感謝。

1

我能想到的只有兩種方式會導致這樣的問題。首先是你的程序中某處存在內存損壞,這可能是可能的,但是我們應該在排除其他選項之後再考慮。

第二個選項是堆棧實際上是空的。您的屏幕截圖不會向我們顯示堆棧的內部大小,它僅向我們顯示在某個點它爲兩個項目分配內存並將它們推送到堆棧。很可能你已經彈出了這些項目,堆棧是空的,仍然指向看似有效的內存。您可以通過推入和彈出一些cout以及在致電top之前打印lsys.vectorStack.size()來證明或反駁這一點。

+1

VS調試器報告deque的當前大小值 - 這是屏幕截圖中[]中的數字。它當然認爲堆棧中實際上有兩個元素。 – JasonD

+0

謝謝馬克我現在就着眼於此,讓你們知道。 – BouncingCzech