2011-04-04 49 views
0

基本上,每当我调用某些函数时,它最终会改变与我所做的无关的其他值。调用函数更改奇怪值

我已经定义

typedef struct { 

double x; 
double y; 
} coordinate; 

class collisionBox { 

public: 
double x, y, lineOfSight, length, width; 
int index, angle; 

coordinate cornerPosition (int number); //corners go clockwise from top 
coordinate position (void); 
coordinate lineOfSightLocation (void); 
collisionBox (void); 
}; 

在该函数的问题出现了:

aCollision collisionImminent (collisionBox object) 
{ 

coordinate corners[3], lOS; 
aCollision result; 

int n = 0; 

while (n <= boxIndex) { 

    if (n != object.index) { 


     corners[0] = allBoxes[n]->cornerPosition(1); 
     corners[1] = allBoxes[n]->cornerPosition(2); 
     corners[2] = allBoxes[n]->cornerPosition(3); 
     corners[3] = allBoxes[n]->cornerPosition(4); 

     cout << "corners[3].y = " << corners[3].y << "\n"; 

     lOS = object.lineOfSightLocation(); 

     cout << "corners[3].y = " << corners[3].y << "\n"; 

角的值[3] .Y更改后我请object.lineOfSightLocation()(其改变为我不明白为什么...

这里的其他功能:

coordinate collisionBox::lineOfSightLocation (void) 
{ 

coordinate lOS; 

lOS.x = x + cos(angle * RADIANS) * lineOfSight; 
lOS.y = y + sin(angle * RADIANS) * lineOfSight; 

return lOS; 
} 

不管怎么说,感谢您的时间和帮助,我可能做一些完全错误的,但我真的不知道它是什么...

回答

6

你很幸运,真的。

如果你看看:

coordinate corners[3], lOS; 

你有角落,然后lOS应该进来内存之后。

后来,你参考一下:

corners[3] = allBoxes[n]->cornerPosition(4); 

第四角阵,不存在英寸你正在写数组的末尾,这是未定义的,但由于变量是如何在内存中布局的,它会写入lOS,而不是崩溃计算机/内爆世界/导致所有时空停止存在。

因此,当您从(不存在的)corners[3]中读取时,您正在从lOS中读取,您刚刚设置了该值。

您只需将声明更改为coordinate corners[4]即可。 :)

+0

时空确实停止了现有的,但只是暂时的,为0秒。 – intuited 2011-04-04 04:11:07

1

您声明角为:

coordinate corners[3] 

这意味着有三个要素:角[0],角[1],和角[2]。但是,你指的是一个角落[3],这是一个界限。在这种情况下,您正在通过修改来破坏堆栈。

您需要声明对象为corners[4]才能够引用角点[3]。我应该补充一点,你有一些重复的代码,你可以用for循环去掉它。这也会使你不太可能引用一个不存在的数组元素(如果你始终使用一个长度变量,而不是某个需要在多个位置保持一致的固定常量)。

1

角点[3]的值发生了变化,因为角点[3]并不存在。

C++中的数组是基于0的。这意味着,当你声明

coordinate corners[3] 

你得到3个坐标......但他们都位于角落[0],角落[1],和角[2]。角落[3]实际上已经过了阵列的末端。巧合的是,由于您直接在角点数组之后声明了los,所以对它的更改恰好是坐标变化的可观察值[3]。这种行为没有定义,当然不应该依赖。

将坐标[3]的定义切换到坐标[4] ...或更好,因为这是C++,请使用vector