Неопределенное поведение при многократном выполнении одной и той же программы - PullRequest
0 голосов
/ 04 ноября 2011

Я получаю странное поведение, когда компилирую ту же программу в Release в VS2010. Если я запускаю программу из cmd.exe несколько раз, результаты становятся бессмысленными. Однако, если я запускаю программу в Debug, результат всегда одинаков.

При запуске новой командной строки программа снова выдает правильные выходные данные.

Есть идеи, что может быть причиной этого?

Screenshot of the command prompt

Редактировать: Код:

int main(int argc, char* argv[])
{
    int* R;
    int capacity;

    if (argc < 2)
    {
        cerr << "Veuillez entrer le chemin du fichier d'entree" << endl;
        return 1;
    }

    vector<BTS> stations;
    LoadFromFile(argv[1], stations, capacity);

    int count = 1;
    if (argc == 3)
    {
        count = atoi(argv[2]);
    }

    clock_t startClock = clock();

    R = new int[capacity+1];
    for(int j = 0; j < count; j++)
    {
        memset(R, 0, capacity + 1);

        for(unsigned int i=0; i < stations.size(); i++)
        {
            for(int j=capacity; j >= 0; j--)
            {
                if(j-stations[i].getNumberOfSubscribers() >= 0)
                {
                    R[j] = max(stations[i].getRevenue() + R[j-stations[i].getNumberOfSubscribers()], R[j]);
                }
            }
        }
    }

    // Print the results
    cout << "Value : " << R[capacity] << endl;
    cout << "Temps total : " << ((float)(clock() - startClock) / (float)CLOCKS_PER_SEC) << " s" << endl;

    delete[] R;

    return 0;
}

void LoadFromFile(std::string filePath, std::vector<BTS>& baseStations, int& capacity)
{
    fstream source(filePath);

    int numberOfStation;
    source >> numberOfStation;
    source >> capacity;

    for (int i = 0; i < numberOfStation; i++)
    {
        int index, revenue, numberOfSuscribers;
        source >> index;
        source >> revenue;
        source >> numberOfSuscribers;

        BTS station = BTS(index, revenue, numberOfSuscribers);

        baseStations.push_back(station);
    }

    source.close();
}

Остальная часть кода - только получатели. Теперь для файла, который я даю в качестве ввода:

10 25
    1     7     6
    2     4     4
    3     7     6
    4     2     1
    5     7     8
    6     9    10
    7     4     5
    8    10    10
    9     1     1
   10    10    10

1 Ответ

2 голосов
/ 04 ноября 2011

Ваш memset неверен.Вы забыли, что sizeof():

memset(R, 0, capacity + 1);

должно быть:

memset(R, 0, (capacity + 1) * sizeof(int));

Так как вы не обнулили все R, верхние его части не определены и даютВы мусорные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...