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]in

于 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;nis7output配列の境界外にあり、毎回データを書き込みます。これも未定義の動作であることに注意してください。あなたはforループに直接アクセスfloat value = input[i];しているので、それは単なるタイプミスだと思います。

アップデート

output[n] = sum;

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

PrefixSumの反復で「n」を「i」に置き換えます;)

于 2013-01-25T08:40:25.120 に答える