2013-01-25 135 views
3

爲什麼以下代碼打印出來"0 0 0 0 0 0 0 "?我期待"1 3 6 10 15 21 28 "陣列/指針混淆

#include <iostream> 

using namespace std; 

void PrefixSum(float * input, float * output, int n){ 
    float sum = 0; 
    for (int i=0;i<n;i++){ 
     float value = input[i]; 
     sum += value; 
     output[n] = sum; 
    }  
} 


int main(int argc, const char * argv[]) 
{ 
    float input[] = {1,2,3,4,5,6,7}; 
    float output[] = {0,0,0,0,0,0,0}; 
    PrefixSum(input, output, 7); 
    for (int i=0;i<7;i++){ 
     cout << output[i] << " "; 
    } 
    return 0; 
} 
+3

應該是'output [i]'。 **在這種情況下,調試器可以幫助你很多**。 – Maroun

回答

9

變化output[n]output[i]相反,你不是在數組中,因爲output[7]書面形式向任何指標超出範圍。 i是你的循環計數器不n

4

變化

output[n] = sum; 

output[i] = sum; 
3

output[n] = sum;n7超出output數組邊界的,你每次向其中寫入數據。請注意,這也是未定義的行爲。您正在訪問for循環中的float value = input[i];,所以我想這只是一個錯字。

更新

output[n] = sum; 

output[i] = sum; 
2

替換爲「N」個「我」在你的迭代中PrefixSum;

4

由於每個人的所指出的,你使用n作爲指標,而不是i) ,所以你絕不會修改數組中的任何值。

寫入循環很容易出錯,我們很多人多年來都會犯錯誤。重用現有的代碼會更好。您正在計算partial_sum。使用標準庫,你可以這樣的代碼是:

#include <iostream> 
#include <numeric> 

int main(int argc, const char * argv[]) 
{ 
    using std::partial_sum; 
    using std::cout; 

    const int SIZE = 7; 
    float input[SIZE] = {1,2,3,4,5,6,7}; 
    float output[SIZE] = {0,0,0,0,0,0,0}; 

    partial_sum(input, input+SIZE, output); 

    for (int i=0;i<SIZE;i++){ 
     cout << output[i] << " "; 
    } 
    return 0; 
} 

我們可以消除環路也打印出結果:

#include <algorithm> 
#include <iterator> 

//... 

using std::copy; 
using std::ostream_iterator; 

copy(output, output+SIZE, 
    ostream_iterator<float>(cout, " ")); 

最後,如果你不需要中間結果陣列,我們可以直接將結果寫入ostream而不是:

partial_sum(input, input+SIZE, 
      ostream_iterator<float>(cout, " ")); 
+0

對於'partial_sum()'+1。 – hmjd