コードにはいくつかの問題があります。
x
は初期値に初期化されていないため、ランダムな値である可能性があります。
while
ループは、ptr[i-2] < max
(i)少なくとも2つの配列要素が必要である、つまり2x
以上の数値に設定する必要があり、(ii)< max
配列内の値を比較しているが、iが2とで割り当てられた配列要素の数の間new
。((ii)がループ内で結合されている場合、割り当てられた配列の終わりを超えて増加し続ける可能性があることを意味しi++
ます。while
i
正しい値に設定x
し、チェックを追加して、配列にアクセスするコード内のすべての配列インデックス<0またはインデックス>=xにアクセスしないようにする必要がありますptr
。
std::vector
自分でメモリを手動で管理する場合は、代わりに使用することを検討してください。
編集:あなたのコードはフィボナッチ数列を計算し、偶数の合計を実行することを意図しているようです。コードを修正するには、次のようにする必要があります。
- 追加し
#include <vector>
ます。
- 消去
int x;
- 削除
int *ptr = new int[x];
して、に置き換えstd::vector<int> v;
ます。
- に置き換え
ptr[0]=1
ますv.push_back(1);
。
- に置き換え
ptr[1]=2
ますv.push_back(2);
。
- whileループ全体を置き換えます。
フィボナッチ数列を計算しているように見えるのでint i=2
、forループの初期化部分で使用してループしv.back() < max
、毎回1つ追加することができます++i
。forループはこれに優れています。ループ内でv.push_back(v[i-1],v[i-2]);
、次の数値を計算して配列に追加できます。
これに関しては、必要に応じて(内部で動的メモリを使用して)ベクトルを成長させるベクトル(つまり、最高のインデックス)の最後にv.push_back(val)
追加されます。はベクトルの最後の要素です。つまり、がである場合にのみ同等です。val
v.back()
v[v.size()-1]
v.empty()
false
- あなたのコメントは、より大きな値を計算するforループについて言及しています。ただし、whileループは
i-2
、i-1
最後から2番目の要素ではなく、最後の要素ではありません。これを使用std::vector
すると、最後の要素が4000000以上の場合にのみ、最後の要素を簡単に削除できます。これは、ifステートメント、つまりif (v.back() >= max)
thenを使用して処理できますv.pop_back();
。
- forループを調整します(つまり、で
i
ある必要がありますv.size()
)。
- 削除し
delete[] ptr;
ます。
動的メモリ割り当てを直接使用する場合は、コードを別の方法で記述する必要があり、配列を「サイズ変更」できる必要があるため、より長く複雑になります(より多くのメモリを割り当て、古いコンテンツをにコピーする必要があります)。新しいもの、そして古いものを破壊する)。ただし、通常は、標準ライブラリコンテナを使用し、メモリを直接管理しないようにする必要があります。この場合std::vector
、数行のコードのみを使用してこのタスクを実行するのに非常に適しています。