C++ 在调试器模式下工作,但不在最终版本中…为什么?

C++ 在调试器模式下工作,但不在最终版本中…为什么?,c++,debugging,visual-c++,C++,Debugging,Visual C++,…我是新来的,我有一个问题,我的代码逻辑似乎没有错误(它确实没有),当我在调试器模式下运行它(使用microsoft visual express C++)时,通过监视变量及其更改,一切都正常工作。然而,当我在发布模式下运行它时,奇怪的是,没有任何东西工作……或更改 我想做的是在一个黑色窗口(800x600)中移动一个精灵,将它的X坐标增加1,直到它到达屏幕的末端,即(spriteX+24>798)(24是精灵边界框的宽度),然后当这种情况发生时,它移动到屏幕的另一端,然后它停止 精灵在屏幕上的

…我是新来的,我有一个问题,我的代码逻辑似乎没有错误(它确实没有),当我在调试器模式下运行它(使用microsoft visual express C++)时,通过监视变量及其更改,一切都正常工作。然而,当我在发布模式下运行它时,奇怪的是,没有任何东西工作……或更改

我想做的是在一个黑色窗口(800x600)中移动一个精灵,将它的X坐标增加1,直到它到达屏幕的末端,即(spriteX+24>798)(24是精灵边界框的宽度),然后当这种情况发生时,它移动到屏幕的另一端,然后它停止

精灵在屏幕上的任意点随机繁殖,然后向右移动,然后向左移动,然后停止,在调试器模式下发生的事情。。。但在释放模式下,它总是在屏幕的左边缘生成,甚至不向右或向左移动,它只是停留在那里

下面是精灵移动的代码

   void Game::PooMove()
{
    /*for (int index = 0; index < npoo; index++)*/
    bool iamfree = true;
    bool iamfree2 = false;
    while (iamfree)
    {
        poox[1]++;

        if (poox[1] + 24 > 799)
        {
            iamfree = false;
            iamfree2 = true;
        }
    }
    while (iamfree2)
    {
        poox[1]--;
        if (poox[1] < 1)
        {
            iamfree2 = false;
        }
    }
}
以及poox和pooy是如何申报的

#define NPOO 3
class Game{
/*many functions and variables*/
int poox[NPOO];
int pooy[NPOO];
}

如果发布构建破坏了东西您可能有未定义的行为(可能是竞争条件)。错误不在您提供的代码中

您的
PooMove
功能的作用是将对象移动到屏幕的右侧,然后再移回左侧。但是,在
PooMove
函数中没有查看对象位置的代码。所以没有办法看到物体在移动。直到
PooMove
完成其工作后,才会出现图形代码。这意味着您只能在屏幕的左侧看到对象,因为
PooMove
就是在左侧放置对象的

事实上,正如现在一样,
PooMove
也可以这样写:

void Game::PooMove()
{
    poox[1] = 0;
}
效果将完全相同,只是不会浪费时间将对象从右向左移动。

这与您在其中一条注释中所写的“优先级”无关,而是与控制流有关

您大概需要做的是使
PooMove
每次调用时只移动一次(假设您在循环中反复调用
Go()

因此,您希望通过
bool iamfree=true来保持它的方向状态;bool-iamfree2=假变量,因此将它们添加为
游戏的状态。当我们在做的时候,让我们把它变成一个布尔并重新命名

class Game
{
    bool goingRight;
 //...
};
现在,您可以在函数中访问该状态并在那里更改它,并在调用之间保持该状态

void Game::PooMove()
{
    if (goingRight)
    {
        poox[1]++;

        if (poox[1] + 24 > 799)
        {
            goingRight = false;
        }
    }
    else
    {
        poox[1]--;
        if (poox[1] < 1)
        {
            goingRight = true;
        }
    }
}
void游戏::PooMove()
{
如果(向右)
{
poox[1]++;
如果(起钻[1]+24>799)
{
正确=错误;
}
}
其他的
{
poox[1]-;
如果(poox[1]<1)
{
正确=正确;
}
}
}

现在它来回移动,但你可以通过引入另一个布尔值来停止它,但我将把它作为练习留给读者。

我看不出你是如何在循环中进行任何移动的绘图操作的。如果你不重新绘制它,它应该如何移动?你确定有什么地方是错的吗。我猜想,当你说“通过监视变量”时,你的意思是“设置断点并逐步通过”。在发布模式下,您无法可靠地使用断点,只有在进行了优化后,在反汇编中单步执行才真正有意义enabled@DarkFalcon该图纸是由putpixel调用(手工绘制)的,希望能澄清一下you@PeterT是的,我就是这么做的,我还能做些什么来确保它工作?@Eyad:当然,但是如果你想看到它移动,你必须在每次改变x坐标时重新绘制它,我不这么认为;我看不到你的代码在这样做……如果你的意思是“中断不工作”……情况并非如此,它确实打开了,并且没有给出错误,只是没有按照它应该的方式运行,以及关于“未定义的行为(可能是竞争条件)”我不知道这是什么意思……对不起,我是个初学者,但无论如何,我感谢你的回复,希望你能解释一下more@Eyad:他所说的“中断”,意思是它没有达到你的预期。当代码在某些情况下做了您期望的事情,但在其他情况下没有做您期望的事情时,通常情况是您的代码,你对代码行为的任何期望都是没有根据的。哦,这解释了很多…谢谢:)发生了什么,但现在似乎起作用了,在人们努力帮助我之后,好了,那么我已经做了测试,也达到了那个结果。。。。现在,如何对函数设置优先级,使其组成框架,然后逐框架执行poomove()确定,感谢您,它现在可以工作了,但是。。。当它减少或增加x时,它会上下移动,因此需要将条件更改为(poox[1]+24>599)当高度值结束时,它的工作原理与预期一致,但它不是左右移动,而是上下移动……我完全没有问题,我会像那样处理它,但我想知道为什么它会颠倒协调。。你知道的好奇心……)@Eyad我不知道你的
Drawpoo
是如何工作的,它是如何使用坐标的。我也不知道
poox
pooy
是如何声明和allocated@Eyad不知道你的代码怎么会这样posted@Eyad您必须在某个地方键入了
pooy
,而不是
poox
,或者在某个地方交换了x和y参数,也许我会检查一下……无论如何,我非常感谢您和每个人和我都会发布我是否输入错误。。。。
void Game::PooMove()
{
    poox[1] = 0;
}
class Game
{
    bool goingRight;
 //...
};
void Game::PooMove()
{
    if (goingRight)
    {
        poox[1]++;

        if (poox[1] + 24 > 799)
        {
            goingRight = false;
        }
    }
    else
    {
        poox[1]--;
        if (poox[1] < 1)
        {
            goingRight = true;
        }
    }
}