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;
}
4

5 回答 5

9

改为output[n]改为output[i],您没有写入数组中的任何索引,因为output[7]超出了范围。i你的循环计数器不是n

于 2013-01-25T08:40:22.863 回答
4

改变

output[n] = sum;

output[i] = sum;
于 2013-01-25T08:40:15.487 回答
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, " "));
于 2013-01-25T08:51:56.243 回答
3

output[n] = sum;, nis7超出output数组边界,每次都向其写入数据。请注意,这也是未定义的行为。您正在float value = input[i];for 循环中访问,所以我想这只是一个错字。

更新

output[n] = sum;

output[i] = sum;
于 2013-01-25T08:40:17.787 回答
2

在 PrefixSum 的 for-iteration 中将 'n' 替换为 'i' ;)

于 2013-01-25T08:40:25.120 回答