为什么以下代码打印出"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;
}
答案 0 :(得分:9)
将output[n]
更改为output[i]
,而不是写入数组中的任何索引,因为output[7]
超出范围。 i
是您的循环计数器n
答案 1 :(得分:4)
变化
output[n] = sum;
到
output[i] = sum;
答案 2 :(得分: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, " "));
答案 3 :(得分:3)
output[n] = sum;
,n
7
超出output
数组边界,每次都会向其写入数据。注意,这也是未定义的行为。你正在访问float value = input[i];
for for循环,所以我猜这只是一个错字。
更新
output[n] = sum;
到
output[i] = sum;
答案 4 :(得分:2)
在PrefixSum的for-iteration中将'n'替换为'i';)