2013-01-25 139 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