0

うまくいったいくつかのオンライン回答を解決するためにこのコードを作成しましたが、この方法で動的メモリを割り当てても大丈夫かどうか疑問に思いました。配列サイズは、ループ全体で継続的に定義されます。大丈夫ですか?

#include <iostream>
using namespace std;

int main ()
{
    int sum=0;
    int x;
    int *ptr = new int[x];
    ptr[0]=1;
    ptr[1]=2;

    int max = 4000000;

    int i=2;

    while (ptr[i-2]<max)            
    {
        ptr[i]=ptr[i-1]+ptr[i-2];
        i++;
    }
    // now we use (i -1) as the last array fill b/c i is bigger than 4 000 000
    // sort with val % 2 == 0  !modulus!

    for (int j=0; j<(i-1); j++) {
        if (ptr[j]%2==0) {
            sum+=ptr[j];
        }
    }

    delete[] ptr;

    cout<<sum;
    return 0;
}
4

4 に答える 4

2

いいえ、初期化されておらず、int x;ごみが含まれている可能性があるため、問題ありません。
編集。
コメントからこの投稿まで。
1)std::vector<int>C-arrayの代わりに使用します。
2)ベクトルを使用したくない場合は、要素をカウントするループを追加してから、配列にメモリを割り当てて操作します。
3)最初と2番目のケースが近づかない場合は、大きなサイズの静的配列を使用します。

于 2012-07-19T04:16:40.333 に答える
0

コードにはいくつかの問題があります。

  1. xは初期値に初期化されていないため、ランダムな値である可能性があります。
  2. whileループは、ptr[i-2] < max(i)少なくとも2つの配列要素が必要である、つまり2x以上の数値に設定する必要があり、(ii)< max配列内の値を比較しているが、iが2とで割り当てられた配列要素の数の間new。((ii)がループ内で結合されている場合、割り当てられた配列の終わりを超えて増加し続ける可能性があることを意味しi++ます。whilei

正しい値に設定xし、チェックを追加して、配列にアクセスするコード内のすべての配列インデックス<0またはインデックス>=xにアクセスしないようにする必要がありますptr

std::vector自分でメモリを手動で管理する場合は、代わりに使用することを検討してください。

編集:あなたのコードはフィボナッチ数列を計算し、偶数の合計を実行することを意図しているようです。コードを修正するには、次のようにする必要があります。

  1. 追加し#include <vector>ます。
  2. 消去int x;
  3. 削除int *ptr = new int[x];して、に置き換えstd::vector<int> v;ます。
  4. に置き換えptr[0]=1ますv.push_back(1);
  5. に置き換えptr[1]=2ますv.push_back(2);
  6. whileループ全体を置き換えます。

フィボナッチ数列を計算しているように見えるのでint i=2、forループの初期化部分で使用してループしv.back() < max、毎回1つ追加することができます++i。forループはこれに優れています。ループ内でv.push_back(v[i-1],v[i-2]);、次の数値を計算して配列に追加できます。

これに関しては、必要に応じて(内部で動的メモリを使用して)ベクトルを成長させるベクトル(つまり、最高のインデックス)の最後にv.push_back(val)追加されます。はベクトルの最後の要素です。つまり、がである場合にのみ同等です。valv.back()v[v.size()-1]v.empty()false

  1. あなたのコメントは、より大きな値を計算するforループについて言及しています。ただし、whileループはi-2i-1最後から2番目の要素ではなく、最後の要素ではありません。これを使用std::vectorすると、最後の要素が4000000以上の場合にのみ、最後の要素を簡単に削除できます。これは、ifステートメント、つまりif (v.back() >= max)thenを使用して処理できますv.pop_back();
  2. forループを調整します(つまり、でiある必要がありますv.size())。
  3. 削除しdelete[] ptr;ます。

動的メモリ割り当てを直接使用する場合は、コードを別の方法で記述する必要があり、配列を「サイズ変更」できる必要があるため、より長く複雑になります(より多くのメモリを割り当て、古いコンテンツをにコピーする必要があります)。新しいもの、そして古いものを破壊する)。ただし、通常は、標準ライブラリコンテナを使用し、メモリを直接管理しないようにする必要があります。この場合std::vector、数行のコードのみを使用してこのタスクを実行するのに非常に適しています。

于 2012-07-19T04:31:37.503 に答える
0

すでに述べたように、x割り当てる配列のサイズとして使用しようとすると、は初期化されません。

ただし、さらに重要なのは、その時点では、必要な配列の大きさが実際にはわからないことです(計算できると確信していますが、ここではそのままにしておきます)。

事前にサイズがわからないため、スペースを割り当て、結果を生成し、サイズを確認し、必要なスペースを増やして、目標に到達するまで続行する必要があります。あるいは、可能性のある最大サイズの安全な(多少緩い場合でも)見積もりを与える、非常に簡単な計算を行うこともできます。1、2から開始し、各セルが前のセルよりも大きくなるため、必要な最大サイズは。以下であると言っても過言ではありませんmax/2 = 2000000

std::vectorまたは、このような状況を処理するためにすでに構築されているを使用することもできます。

于 2012-07-19T04:31:44.180 に答える
0

いいえ、初期化されていないためint xです!

于 2012-07-19T04:25:27.193 に答える