我有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;
}
}
}
现在我有两个主要问题:
如果我使用co_ord [300] [300] [300],程序会出现分段错误。如果放在3个连续的for循环之前, cout 语句将执行,但之后不会执行; 当我将co_ord的维度减少到co_ord [100] [100] [100]时,这个问题就解决了,我将能够在其他地方宣传一个声明。
然而,还有另一个奇怪的问题,我仍然不知道为什么会这样。发生这种情况的区域在前面的代码中标记为“问题区域”。基本上发生的事情是co_ord [z] [y] [x]会在第一个循环之后给出一些奇怪的值。第一个循环运行良好,即co_ord [-9] [0] [1]将cout -1,但在第二个循环中,我有6783这样的值,有时可能高达8位数。但这是在第二次循环期间发生的。我已经尝试了所有我知道但我没有成功的事。
拜托,有人可以提供一个线索,说明我为什么会遇到上述2个错误或其中的错误?正如我所说的,我在我的系统上运行的代码类似于大型应用程序的一部分。在代码中,他们为他们创建的容器类实现了一些内存分配过程,但是他们的过程对我来说很复杂,因此我决定使用标准的c ++库向量。任何帮助将不胜感激。
抱歉早些时候发布错误的代码,我已经纠正了大多数(我希望所有)的拼写错误
答案 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)
- 如果我使用co_ord [300] [300] [300],程序会出现分段错误。
醇>
当然。您的代码在所有三个维度上声明此数组的范围为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);