【问题标题】:c++ having strange problemc++有奇怪的问题
【发布时间】:2010-09-07 03:39:09
【问题描述】:

我有一个函数可以在向量中创建和插入一些数字。

    if(Enemy2.dEnemy==true)
    {
        pt.y=4;
        pt.x=90;
        pt2.y=4;
        pt2.x=125;
        for(int i=0; i<6; i++)
        {
            Enemy2.vS1Enemy.push_back(pt);
            Enemy2.vS2Enemy.push_back(pt2);
            y-=70;
            pt.y=y;
            pt2.y=y;
        }
        Enemy2.dEnemy=false;
        Enemy3.cEnemy=0;
    }

它应该在两个向量中插入 6 个数字,唯一的问题是它没有 - 它实际上插入了 更多

我认为除非Enemy2.dEnemy == true,否则 sn-p 不会运行,而且它不会永远保持不变。

第一次运行 sn-p 时,Enemy2.dEnemy 被设置为 false,它不应该再次运行。

除了创建窗口时,我不会在任何地方将Enemy2.dEnemy 设置为true

如果我在 sn-p 中的任何位置插入断点,程序将正常工作 - 它只会在两个向量中插入 6 个数字。

有什么想法吗?


好的,所以我做了一些调试。
我发现 Enemy2.dEnemy=false; 由于某种原因被跳过了。
我试着这样做看看是不是。
 if(Enemy2.dEnemy)
    {
        pt.y=4;
        pt.x=90;
        pt2.y=4;
        pt2.x=125;
        for(int i=0; i<6; i++)
        {
            Enemy2.vS1Enemy.push_back(pt);
            Enemy2.vS2Enemy.push_back(pt2);
            y-=70;
            pt.y=y;
            pt2.y=y;
        }
        TCHAR s[244];
        Enemy2.dEnemy=false;
        if(Enemy2.dEnemy)
        {
          MessageBox(hWnd, _T("0"), _T(""), MB_OK);
        }
        else
        {
            MessageBox(hWnd, _T("1"), _T(""), MB_OK);
        }
        Enemy3.cEnemy=0;
    }

消息框弹出说 1,我的代码运行良好。看来Enemy2.dEnemy=false; 没时间跑了;/
哇哇哇哇哇哇哇哇哇哇哇哇哇! 好的,我发现导致插入超过 6 个数字的真正问题在哪里.. 这是我分配Enemy2.dEnemy=true;的地方

if(Enemy2.e1)
{
Enemy2.now=time(NULL);
Enemy2.tEnemy=Enemy2.now+4;
Enemy2.e1=false;
}
if(Enemy2.tEnemy==time(NULL))
{
check=1;
Enemy2.aEnemy=0;
Enemy2.dEnemy=true;
}

问题似乎是第二个 if 运行了不止一次,这很奇怪!

【问题讨论】:

  • 请澄清:代码有什么问题?
  • 是C++还是C++代码有问题?
  • 你在使用多线程吗?
  • 这里没有足够的上下文来解释发生了什么 - 每当该代码运行时,它都会将六个点准确地推入每个向量中。大概你的问题在它之外的某个地方。
  • 这可能是使用久经考验的“std::cout”调试方法的时候了 :) 每次 push_back 发生时打印一些东西。有12个打印输出吗?如果是这样……很奇怪。如果不是……那就多投点球吧!请谨慎行事,并确保您的代码不会因为额外的控制台输出而开始表现不同:)

标签: c++ visual-c++ winapi vector


【解决方案1】:

首先要做的是:摆脱那个可恶的if (Enemy2.dEnemy == true) - 它应该是:

if (Enemy2.dEnemy)

(我也更喜欢将我的布尔值命名为可读的句子片段,例如 Enemy2.isABerserkerEnemy3.hasHadLeftLegCutOffThreeInchesBelowTheKnee,但这只是个人喜好)。

除此之外,我唯一能建议的是线程问题。这段代码本身没有问题,但是有一个窗口可以让两个线程进入if 语句并开始将值推送到您的向量中。

换句话说,如果线程 1 在线程 2 遇到 if 语句时进行推送,那么线程 2 也将开始推送值,因为线程 1 尚未将 dEnemy 设置为 true。并且不要认为您可以将分配移动到 if 块的顶部 - 这会减少但不会删除窗口。

我的建议是在向量条目超过六个的情况下打印出向量的内容,这可能会为发生的事情提供线索(如果您愿意,可以在此处发布输出)。


您的更新是,下面的第二个 if 运行了两次:

if(Enemy2.e1)
{
Enemy2.now=time(NULL);
Enemy2.tEnemy=Enemy2.now+4;
Enemy2.e1=false;
}
if(Enemy2.tEnemy==time(NULL))
{
check=1;
Enemy2.aEnemy=0;
Enemy2.dEnemy=true;
}

如果此代码在同一秒内执行两次(并且这没有超出可能的范围),第二个 if 语句运行两次。

那是因为time(NULL) 为您提供了自纪元以来的秒数,因此,直到那一秒结束,您很可能正在执行该if 的内容数千次 次(或更多)。

【讨论】:

  • +1 推荐反对 if (condition==true) 成语。总是让我想尖叫。
  • @paxdiablo, Kristopher Johnson:你能分享更多关于这个成语的信息吗?
  • @chubsdad, condition 是一个布尔值。如果您将其与true 进行比较,您会在哪里停下来? Reductio ad Absurdum 规定你不要停下来,导致if ((!((x == true) == true) == false) == true) ... :-) 见stackoverflow.com/questions/404838/…
  • @Ramiz,你可能认为你的游戏只使用一个线程。您的操作系统可能有其他想法 :-) 在 if 语句中添加一些代码以将一行附加到临时文件或增加一个稍后打印的全局整数 - 这是您可以确定的唯一方法。
  • 我不知道如何将行追加到临时文件或增量
【解决方案2】:

如果当您输入断点或诊断输出消息时此问题消失,则强烈提示问题是未定义的行为,这通常是由取消引用未初始化的指针或粗心使用 const_cast 等原因引起的。

问题的原因可能与您正在查看的代码无关。它是由其他地方引起的,恰好出现在这里。就像有人被落下的砖头撞到一样:明显的症状是一个人昏迷不醒地倒在人行道上,但真正的问题与人或人行道无关,它有好几层楼。

如果您想找出错误的原因,请删除您的诊断程序,直到问题再次出现,然后开始删除其他所有内容。修剪掉所有其他代码。每当错误停止时,备份直到它再次开始;如果您没有看到错误的原因,请在其他地方开始修剪。最终这个 bug 将无处可藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2011-05-16
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多