C ++程序在调试和发布模式下提供不同的结果

时间:2016-01-07 15:05:51

标签: c++

我做了一些算法练习,遇到了一个奇怪的问题。我编写了下面的代码来解决这个问题http://main.edu.pl/en/archive/oi/21/pta。我测试了它,看起来它在调试模式下工作正常,但是一旦我切换到Release(或将其提交到网站),它就会给出一些测试的错误答案。

例如对于9e.in(我在这里上传了这个测试:https://www.dropbox.com/s/ki4vfk2p5140xwo/pta9e.in?dl=0)我从Debug构建中获得的答案是正确的:

255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255

但是,在发布中(以及提交到网站后),我得到:

543
530
530
530
530
530
543
530
530
530
543
530
530
543
530
530
530
543
530
530
543
530
530
530
530

我不知道是什么导致了这个问题:/这是我的代码:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <stdio.h>

using namespace std;

int numOfTrees = 0;
int* trees = NULL;

int numOfBirds = 0;

int computeBird(int birdStamina)
{
    int tired = 0;

    int position = 0;
    int lastTree = 0;

    while (true)
    {
        if (position >= numOfTrees - 1)
        {
            return tired;
        }

        lastTree = trees[position];

        int furthestGoodTree = -1;

        int tallestTreePos = position + birdStamina;
        if (tallestTreePos > numOfTrees - 1)
        {
            tallestTreePos = numOfTrees - 1;
        }

        int tallestTreeSize = trees[tallestTreePos];

        for (int n = 1; n <= birdStamina; ++n)
        {
            int pos = position + n;

            if (pos >= numOfTrees)
                break;

            if (trees[pos] < lastTree)
            {
                if (trees[pos] >= trees[furthestGoodTree])
                {
                    furthestGoodTree = pos;
                }
            }

            if (trees[pos] >= tallestTreeSize)
            {
                tallestTreeSize = trees[pos];
                tallestTreePos = pos;
            }
        }

        if (furthestGoodTree != -1)
        {
            position = furthestGoodTree;
        }
        else
        {
            position = tallestTreePos;
            tired++;
        }
    }
}

int main()
{
    scanf("%d", &numOfTrees);

    trees = new int[numOfTrees + 2];

    int val = 0;

    for (int n = 0; n < numOfTrees; ++n)
    {
        scanf("%d", &val);
        trees[n] = val;
    }

    scanf("%d", &numOfBirds);

    int* cache = new int[numOfTrees + 2];

    for (int n = 0; n < numOfTrees; ++n)
    {
        cache[n] = -1;
    }

    int results[30];

    int birdStamina = 0;

    for (int n = 0; n < numOfBirds; ++n)
    {
        scanf("%d", &birdStamina);

        if (cache[birdStamina] != -1)
        {
            results[n] = cache[birdStamina];
        }
        else
        {
            int result = computeBird(birdStamina);

            cache[birdStamina] = result;
            results[n] = result;
        }
    }

    for (int n = 0; n < numOfBirds; ++n)
    {
        printf("%d\n", results[n]);
    }

    //system("pause");

    return 0;
}

2 个答案:

答案 0 :(得分:0)

这段代码真的应该有我添加的断言

       if (trees[pos] < lastTree)
        {
            assert( furthestGoodTree >= 0 );
            if (trees[pos] >= trees[furthestGoodTree])
            {
                furthestGoodTree = pos;
            }
        }

据我所知,这种情况与数据有关,不受其他代码的强制,当然也不是任何本地代码所强制的。

当你依赖某些条件为真并且本地不明显为什么它应该是真的时,你应该有一个assert所以调试运行会注意到不正确的假设。

答案 1 :(得分:-1)

我不确定您输入了什么输入数据,但在我看来,您已超出数组边界。例如,您将缓存分配为 numOfTrees 的数组,但稍后会按索引 numOfBirds 读取它。我假设发布和调试版本具有不同的内存分配,因此您的超出边界读取会给您不同的结果。