基本上,每当我调用某些函数时,它最终会改变与我所做的无关的其他值。
我已经定义了
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";
在调用object.lineOfSightLocation()之后,corner [3] .y的值发生了变化(它改变为lOS的y值),我无法弄清楚为什么...
这是另一个功能:
coordinate collisionBox::lineOfSightLocation (void)
{
coordinate lOS;
lOS.x = x + cos(angle * RADIANS) * lineOfSight;
lOS.y = y + sin(angle * RADIANS) * lineOfSight;
return lOS;
}
无论如何,感谢你的时间和帮助,我可能做了一些完全错误的事情,但我真的不知道它是什么......
答案 0 :(得分:6)
实际上你很幸运。
如果你看一下:
coordinate corners[3], lOS;
你有 3 角落,然后lOS
应该在内存之后立即出现。
稍后,请参阅:
corners[3] = allBoxes[n]->cornerPosition(4);
数组中的第四个角,它不存在。您正在编写未定义的数组末尾,但由于变量在内存中的布局,它会写入lOS
而不是崩溃您的计算机/破坏世界/导致所有时空停止现有
因此,当你从(不存在的)corners[3]
读取时,你正在阅读你刚刚设定的lOS
。
您只需将声明更改为coordinate corners[4]
即可。 :)
答案 1 :(得分:1)
您将角落声明为:
coordinate corners[3]
这意味着有三个元素:角[0],角[1]和角[2]。然而,你指的是一个角落[3],这是一个超出界限。在这种情况下,您通过修改它来破坏堆栈。
您需要将对象声明为corners[4]
才能引用角落[3]。我应该补充说,你有一些重复的代码,你可以摆脱for循环。这也会降低您引用不存在的数组元素的可能性(如果您一直使用长度变量,而不是需要在多个位置保持一致的某个固定常量)。
答案 2 :(得分:1)
角[3]的值发生了变化,因为角落[3]并不存在。
c ++中的数组是基于0的。这意味着当您声明
时coordinate corners[3]
你得到3个坐标......但是它们位于角落[0],角落[1]和角落[2]。 Corners [3]实际上已超过数组的末尾。巧合的是,由于你在角阵列之后直接声明了洛杉矶,因此对它的变化恰好可以作为坐标变化[3]来观察。这种行为没有定义,当然不应该依赖。
将坐标[3]的定义切换到坐标[4] ......或者更好,因为这是C ++,使用vector。