簡體   English   中英

同一程序每隔運行一次就會產生不同的輸出

[英]same program produces different output every other run

這是我編寫的快速骯臟程序的一部分,用於進行一些統計計算。 有時我會給我預期的輸出,即:

42 1 1
48 13 14
54 12 26
60 11 37
66 6 43
72 13 56
78 23 79
84 14 93
90 6 99
96 0 99
102 0 99
108 1 100

但是有時(大約是我運行程序的50%),輸出的最后一行會有所不同,如下所示:

108 2 101

我正在Debian 64位上使用gcc 7.3.0進行編譯,除了-o外沒有編譯器標志

我知道,該程序可以更優雅地編寫,但是我不知道這種奇怪的行為是從哪里來的。

#include <iostream> //cout, endl
#include <algorithm> //sort
#include <iomanip> // setw(), setfill(), left, right

using namespace std;

void classes(int, int, int[]);

static int sizeOfData = 0;

int main()
{
    int data[] ={
                    80, 71, 57, 80, 75, 77, 60, 86, 77, 56, 81, 50, 89, 54, 90, 73, 60, 83, 65, 82, 84, 54, 85, 58, 79,
                    57, 88, 68, 76, 78, 74, 85, 75, 65, 76, 58, 91, 50, 87, 48, 93, 54, 86, 53, 78, 52, 83, 60, 87, 49,
                    80, 60, 92, 43, 89, 60, 84, 69, 74, 71, 108, 50, 77, 57, 80, 61, 82, 48, 81, 73, 62, 79, 54, 80, 73,
                    81, 62, 81, 71, 79, 81, 74, 59, 81, 66, 87, 53, 80, 50, 87, 51, 82, 58, 81, 49, 92, 50, 88, 62, 93
                    };

    sizeOfData = sizeof(data)/sizeof(data[0]);
    sort(data, data + sizeOfData);

    classes(42, 6, data);
}

void classes(int start, int step, int data[])
{
    int counter = 0;
    int classCounter = 0;

    const char separator = ' ';
    int tabWidth = 8;

    cout << endl;
    cout << left << setw(tabWidth) << setfill(separator) << "class";
    cout << left << setw(tabWidth) << setfill(separator) << "#";
    cout << left << setw(tabWidth) << setfill(separator) << "# cumulative";
    cout << endl << endl;

    int i = 0;
    while(i < sizeOfData)
    {
        classCounter = 0;
        while(data[i] < start + step)
        {
            classCounter++;
            counter++;
            i++;
        }
        cout << left << setw(tabWidth) << setfill(separator) << start;
        cout << left << setw(tabWidth) << setfill(separator) << classCounter;
        cout << left << setw(tabWidth) << setfill(separator) << counter;
        cout << endl;
        start = start + step;
    }
}

您的程序在上一次迭代中具有未定義的行為。 如果i在上一次迭代中為99,則可以很高興地在內部循環中超出數組的界限,此后data[i]是未定義的行為。

為了解決這個問題,最簡單的方法是檢查內部條件下i是否不大於sizeOfData

while((i < sizeOfData) && (data[i] < start + step))

值得考慮選擇一個像std::vectorstd::array這樣的STL容器-這樣可以簡化對數組大小的處理,並且可以使classes功能更通用。

您無需檢查嵌套循環中的i < sizeOfData 那就是問題所在。 它可能會超出范圍- 未定義的行為

for循環中的計數器i超出了您在代碼中使用的sizeOfData的邊界。 嘗試檢查i值以避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM