C++ - 動的割り当てによる配列値のリセットの問題

okwaves2024-01-25  7

クラス、動的割り当てなどを使用して小さなプログラムを作成しようとしています... これが「問題」です。コード:

void Social::calc_pop(double years) const {
    double var = births - deaths;
    double* pop = new double;
    pop[0] = pop_0;
    for (int i = 0; i < years; i++)
    {
        pop[i+1] = pop[i] + var;
        std::cout << "La popolazione all'anno " << i+1 << " è pari a " << pop[i+1] << std::endl;
    }
    delete pop;
}

出力は次のようになります (年 = 10、pop_0 = 300、誕生 = 10、死亡 = 9):

pop[1] = 301
pop[2] = 302
pop[3] = 303
pop[4] = 304
pop[5] = 1
pop[6] = 1
pop[7] = 1
pop[8] = 2
pop[9] = 3
pop[10] = 4

私のコードのどこが間違っているのでしょうか?

1

年が 2 倍になるのはなぜですか?

– モルブドニロ

2020 年 9 月 3 日 15:39

はい、double であってはなりません。

– サンファイブ

2020 年 9 月 3 日 15:40

1

@sungfive これに動的に管理される配列が本当に必要な場合は、std::vector<double> を使用します。 C++ で。

– πάντα ῥεῖ

2020 年 9 月 3 日 15:44



------------------------

このコード:

double* pop = new double;

は単一の double を割り当てますが、その後、Pop を配列のように扱うため、0 以外の位置にインデックスを付けると未定義の動作が呼び出されます。

代わりに、配列を割り当てる必要があります。

double* pop = new double[years + 1];

年を int にするか、新しい式内で int にキャストする必要があることに注意してください。

これは後で次のように削除されます:

delete [] pop;

ただし、このコードは記述しないでください (動的割り当ての仕組みを練習しているだけでない限り)。 Pop をベクターにするだけで、多くの手間を省くことができます。

std::vector<double> pop(years + 1);

5

次のように返されます: &「エラー: new-declarator の式は整数型または列挙型でなければなりません」

– サンファイブ

2020 年 9 月 3 日 15:37

1

years は int であるか、少なくとも新しい式では int にキャストされる必要があります。それを回答に追加しました。

– シジエン

2020 年 9 月 3 日 15:40

そうですね、int i では 2 年は意味がありません。

– サンファイブ

2020 年 9 月 3 日 15:43

1

@cigien C++ での動的メモリ管理の新規/削除についてはアドバイスしないでください。

– πάντα ῥεῖ

2020 年 9 月 3 日 15:45

2

@πάνταῥεῖ 私は実際にアドバイスしているわけではなく、質問に答えているだけです。しかし、あなたは正しいです。代わりにベクトルを示唆するメモを追加しました。

– シジエン

2020 年 9 月 3 日 15:48



------------------------

単一の double を割り当てているだけで、これは配列として扱われます。インデックスが 0 より大きい場合、その動作は未定義です。 また、年要素の配列を割り当てることもできません。年は整数ではないためです。3.125 の double の配列はどのようになりますか?

この計算にはいかなる種類のコレクションも必要ありません。最後の既知の値のみが必要です。

void Social::calc_pop(int years) const {
    double var = births - deaths;
    double pop = pop_0;
    for (int i = 0; i < years; i++)
    {
        pop = pop + var;
        std::cout << "La popolazione all'anno " << i+1 << " è pari a " << pop << std::endl;
    }
}

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。