我正在學習C++,並決定製作一些小而短的函數來練習。這下面的代碼位會給我一個不正確的答案:爲什麼這一個,毫無意義的代碼是唯一讓這個功能起作用的東西?
float pairwiseSum(float data[], int arraySize, int naive_sum_size=8) {
if (arraySize <= naive_sum_size) {
return naiveSum(data, arraySize);
} else {
int m = arraySize/2;
return pairwiseSum(&data[0], m) + pairwiseSum(&data[m], arraySize-m);
}
}
naiveSum在這種情況下只是遍歷數組積累的總和,似乎很好地工作。如果我有1秒64的陣列,它會告訴我的總和是288
然而,這個版本的代碼工作完美每次:
float pairwiseSum(float data[], int arraySize, int naive_sum_size=8) {
if (arraySize <= naive_sum_size) {
cout << "";
return naiveSum(data, arraySize);
} else {
int m = arraySize/2;
return pairwiseSum(&data[0], m) + pairwiseSum(&data[m], arraySize-m);
}
}
我使用的Fedora 21,並與編譯g ++ 4.9.2
爲什麼一個函數有效,但另一個失敗?
編輯:它出現在我的main.cpp文件中的完整程序如下。
#include <iostream>
#include <stdlib.h>
using namespace std;
float naiveSum(float data[], int arraySize) {
float sum;
for (int i = 0; i < arraySize; i++)
sum += data[i];
return sum;
}
// Divide-and-conquer algorithm is a little faster than the
// Kahan Summation Algorithm, but also less accurate.
float pairwiseSum(float data[], int arraySize, int naive_sum_size=8) {
if (arraySize <= naive_sum_size) {
//cout << "";
return naiveSum(data, arraySize);
} else {
int m = arraySize/2;
return pairwiseSum(&data[0], m) + pairwiseSum(&data[m], arraySize-m);
}
}
int main() {
const int SIZE = 64;
const int rndRange = 100;
// generate random array
srand(time(NULL));
float xs[SIZE];
for (int i=0; i<SIZE; i++)
// +1 prevents division by zero
//xs[i] = rand() % rndRange/(float)(rand() % rndRange + 1);
xs[i] = 1;
// Print kahan sum of random array
//cout << "Kahan Sum: " << kahanSum(xs, SIZE) << endl << endl;
cout << endl << pairwiseSum(xs, SIZE) << endl;
return 1;
}
編輯:是的,這確實是一個問題,總和沒有被初始化。謝謝你的幫助。
_undefined behaviour_立即出現紅色標記。啓動你的調試器並檢查你的數組索引。 –
因爲你需要提供[mcve]。 –
你在問爲什麼你沒有顯示的功能不起作用。 –