2011-01-05 144 views
0

我有我有x,y,z座標和另一個參數 - 能量的對象。具有相同x,y,z座標的物體的能量將被總結。我已經看到一個程序如何實現並遵循完全相同的方法,但是,我的程序失敗了,我不明白爲什麼。被覆蓋的C++向量

概述是方法。

我有一個D類對象的向量;

class D; //for the sake of time you will understand the structure of this class as u keep reading 

int main() 
{ 
    vector< D>cont; //the objects to be summed are stored in this container 
    vector< D>cont2; //Second container: you will see the need later on 

    co_ord [100][100][100]; //Declare the range of available x, and z coordinates 

    for (int z = -49; z<50; z++) 
     for (int y = -49; y<50; y++) 
      for (int x = -49; x<50; x++) 
       co_ord[z][y][x] = -1; 

for (int i = 0; i < cont.size(); i++){ 
    int x, y, z, E; 
**//PROBLEM AREA!!!** 
    x = cont[i].getx();//member function of class D : returns x of current obj 
    y = cont[i].gety(); 
    z = cont[i].gez(); 
    E = cont[i].getE(); 
if(x>=50){x = 49;} 
if(y>=50){y = 49;} 
if(z>=50){z = 49;} 

    if(x<= -50){x = -49;} 
    if(y<= -50){y = -49;} 
if(z<= -50){z = -49;} 

    if (co_ord[z][y][x] = -1) 
    { 
    D obj(x, y, z, E); //create new object of class D 
    cont2.push_back(obj); 
    int index = cont2.size(); 
    co_ord[z][y][x] = index - 1; // co_ord[z][y][x] has the storage index of this co-ordinate 
    } 
else {cont2[co_ord[z][y][x]].AddEn(E); //AddEn() is a member function of class D that adds energy to "this" obj;  
    return 0; 
    } 
} 

}

現在我有2個主要問題:

  1. 如果我使用co_ord [300] [300] [300],程序給出一個分段錯誤。如果在3個連續for循環之前放置語句,則執行語句cout; 當我將co_ord的維數減少到co_ord [100] [100] [100]時,這個問題就解決了,我將能夠在其他地方發表一個聲明。

  2. 但是,還有一個奇怪的問題,我仍然不知道這是爲什麼。在前面的代碼中,發生這種情況的區域被標記爲「PROBLEM AREA」。基本上會發生什麼,co_ord [z] [y] [x]會在第一個循環後發出一些奇怪的值。第一個循環運行良好,即co_ord [-9] [0] [1]將cout -1,但在第二個循環中,我有像6783這樣的值,其他有時可能會達到8位數。但是這在第二個循環中發生。我嘗試了我所知道的一切,但我沒有成功。

    請問,有人可以提供一個線索,爲什麼我有上述2個錯誤或解決方法嗎?正如我所說的,我有一個類似的代碼在我的系統上運行,這是一個更大的應用程序的一部分。在代碼中,他們爲他們創建的容器類實現了一些內存分配過程,但是他們的過程對我來說很複雜,因此我決定使用標準C++庫向量來完成它。任何幫助將不勝感激。

抱歉張貼錯誤代碼前,我已經糾正了大多數(我希望所有)錯別字

+1

是否有省略的代碼,你填'cont'或'cont2'? – 2011-01-05 15:06:08

+1

EH?負數索引到一個數組(-9)?有沒有搞錯?有沒有我錯過的東西?也許你應該首先打印所有'D'對象的位置並仔細查看索引! – Nim 2011-01-05 15:11:10

+0

你應該真正解決你的代碼示例,並生成至少一個可編譯的例子 - 否則我們將整天坐在這裏,突出顯示真正基本的錯誤(除非你想要)? – Nim 2011-01-05 15:25:44

回答

5

如果我使用co_ord [300] [300] [300],該 程序給出一個分段錯誤。

這是正常現象。假設你有int a[2];它是從零開始的兩個元素的數組(a[0]a[1])。 a[2]將是第三個元素,並訪問它導致未定義的行爲。

co_ord [-9] [0] [1]將清點-1,但在第二循環中,我有像如上6783

類似的問題的值。如果您有a[10],則可以通過a[n]訪問它,並且n有[0,9]的範圍。用負值訪問它是未定義的行爲。

for (int i = 0; i < cont.size(); i++) 
    int x, y, z, E; 

這是一個空操作,因爲對於沒有括號(良好的縮進習慣,你似乎並不具備,會作出錯誤明顯)。因爲你然後使用變量 - 這將超出範圍 - 我不知道你的程序如何成功編譯。除此之外,你也有一個co_ord[300][300][300]沒有類型的行,這也不應該編譯。

+0

謝謝大家的評論,我從你的評論中學到了很多東西,並會對代碼進行調整。 for循環中有一個括號,但我在發佈時錯誤地忽略了它。感謝您的評論。 – Charles 2011-01-05 16:26:36

+0

對不起,我最初的帖子一定有些混亂。我在代碼中改變了一些東西,這樣x,y和z從正值開始,程序正在運行。即對於(int x = 0; x <100; x ++) for(int y = 0; y <100; x ++) (int z = -49; z <50; z ++) co_ord [z] [y] [x] = -1; 我設置對象的任何x,y或z大於99到99,任何<0到0,代碼工作正常。 H/V,如果我嘗試將數組的大小改爲co_ord [300] [300] [300],那麼我會得到分段錯誤。 – Charles 2011-01-05 17:06:51

4
  1. 如果我使用co_ord [300] [300] [300],該程序給出了分段錯誤。

當然。您的代碼在所有三維上聲明此數組的範圍爲0-299(含)。現在

,從您的代碼:

if (co_ord[z][y][x] = -1) 

通知=代替==。您正在分配,而不是比較。

+0

謝謝,它是原始代碼中的==。在這裏輸入和編輯它時,我犯了很多錯誤。感謝您指出了這一點。 – Charles 2011-01-05 16:27:55

3

你錯過了for循環的括號:

for (int i = 0; i < cont.size(); i++) 
{ 
... 
} 
+0

這不是問題,它只是一個錯字,如果沒有它們,它將無法編譯(您不能將單個聲明作爲for循環的主體)。另外,這裏還有一個端支架,所以它們甚至會失去平衡。 – falstro 2011-01-05 15:09:29

0

也是錯別字?

cont2.push_back(ob); 

它不應該是:

cont2.push_back(obj); 
+0

是的,是一個錯字 – Charles 2011-01-05 16:28:27