C++向量被覆盖

0 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

}

现在我有两个主要问题:

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

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

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

对不起早些时候发布错误的代码,我已经纠正了大多数(我希望所有)的错别字

Tho*_*ini 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;
Run Code Online (Sandbox Code Playgroud)

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