![](/img/trans.png)
[英]C++: Why does the same code run in Eclipse Neon produces different output in Visual Studio 2013?
[英]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::vector
或std::array
這樣的STL容器-這樣可以簡化對數組大小的處理,並且可以使classes
功能更通用。
您無需檢查嵌套循環中的i < sizeOfData
。 那就是問題所在。 它可能會超出范圍- 未定義的行為 。
for
循環中的計數器i
超出了您在代碼中使用的sizeOfData
的邊界。 嘗試檢查i
值以避免這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.