我有两个课程:矢量和粒子......
class Vector {
public:
float x,y;
};
class Particle {
public:
Vector* coord;
Particle(Vector* coord)
{
this->coord = coord;
};
};
...和一个声明如下的数组:
Particle* particles [PARTICLES];
这是我的主要内容:
int main(int argc, char** argv)
{
//Write
int i = 0;
do{
particles[i] = new Particle(new Vector());
}while(
++i<PARTICLES
);
i = 0;
//Read
int j = 0;
float s = .0f,
a = .0f;
Vector vi = *(particles[0]->coord),
vj = *(particles[0]->coord);
do{
do{
if(i!=j){
vi = *(particles[i]->coord);
vj = *(particles[j]->coord); //FIXME
}
}while(
++j<PARTICLES //For values >1 throws SIGSEGV
);
}while(
++i<PARTICLES
);
return 0;
}
只要粒子> 1,就会抛出SIGSEGV。注释掉 FIXME 行使其无误地工作。
此处的完整代码:http://codepad.org/dI2ve5Pc
为什么它会失败并且有办法解决它?
谢谢:)
答案 0 :(得分:7)
循环写错了。在内循环的第二次迭代之前,j
未重置。为什么不像大多数人通常那样对循环进行编码:
for (i = 0; i < PARTICLES; i++) {
for (j = 0; j < PARTICLES; j++) {
// ...
}
}
答案 1 :(得分:3)
请务必在j
循环的每次迭代后将0
重置为j
:
do{
do{
if(i!=j){
vi = *(particles[i]->coord);
vj = *(particles[j]->coord); //FIXME
}
}while(
++j<PARTICLES //For values >1 throws SIGSEGV
);
// Reset j here
j = 0;
///////////////
}while(
++i<PARTICLES
);