C ++向量被覆盖

时间:2011-01-05 15:02:07

标签: c++

我有x,y,z坐标的对象和另一个参数 - 能量。具有相同x,y,z坐标的物体的能量将被总结。我已经看过一个程序如何实现它并遵循完全相同的方法,但是,我的程序失败了,我不明白为什么。

概述了方法。

我有一个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;
   }
}

}

现在我有两个主要问题:

  1. 如果我使用co_ord [300] [300] [300],程序会出现分段错误。如果放在3个连续的for循环之前, cout 语句将执行,但之后不会执行; 当我将co_ord的维度减少到co_ord [100] [100] [100]时,这个问题就解决了,我将能够在其他地方宣传一个声明。

  2. 然而,还有另一个奇怪的问题,我仍然不知道为什么会这样。发生这种情况的区域在前面的代码中标记为“问题区域”。基本上发生的事情是co_ord [z] [y] [x]会在第一个循环之后给出一些奇怪的值。第一个循环运行良好,即co_ord [-9] [0] [1]将cout -1,但在第二个循环中,我有6783这样的值,有时可能高达8位数。但这是在第二次循环期间发生的。我已经尝试了所有我知道但我没有成功的事。

    拜托,有人可以提供一个线索,说明我为什么会遇到上述2个错误或其中的错误?正如我所说的,我在我的系统上运行的代码类似于大型应用程序的一部分。在代码中,他们为他们创建的容器类实现了一些内存分配过程,但是他们的过程对我来说很复杂,因此我决定使用标准的c ++库向量。任何帮助将不胜感激。

  3. 抱歉早些时候发布错误的代码,我已经纠正了大多数(我希望所有)的拼写错误

4 个答案:

答案 0 :(得分:5)

  

如果我使用co_ord [300] [300] [300],那么   程序给出了分段错误。

这很正常。假设你有int a[2];它是一个由两个元素组成的数组,从零开始(a[0]a[1])。 a[2]将是第三个元素,访问它会导致未定义的行为。

  

co_ord [-9] [0] [1]将cout -1,但在第二个循环中,我的值为6783

与上述类似的问题。如果您有a[10],则可以通过a[n]访问它,其中n为[0,9]范围。使用负值访问它是未定义的行为。

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

这是一个无操作,因为for没有括号(良好的缩进习惯,你似乎没有,会使错误明显)。既然你使用变量 - 这将超出范围 - 我不知道你的程序如何成功编译。除此之外,你还有一行co_ord[300][300][300]没有类型,也不应该编译。

答案 1 :(得分:4)

  
      
  1. 如果我使用co_ord [300] [300] [300],程序会出现分段错误。
  2.   

当然。您的代码在所有三个维度上声明此数组的范围为0-299(含)。

现在,从你的代码:

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

请注意=而不是==。你是分配,而不是比较。

答案 2 :(得分:3)

你错过了for循环的括号:

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

答案 3 :(得分:0)

也是一个错字?

cont2.push_back(ob);

不应该是:

cont2.push_back(obj);