调用函数会改变奇怪的值

时间:2011-04-04 03:27:21

标签: c++

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

我已经定义了

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;
}

无论如何,感谢你的时间和帮助,我可能做了一些完全错误的事情,但我真的不知道它是什么......

3 个答案:

答案 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