3

7桁の入力(電話番号)を取得して、円周率の桁にあるかどうかを確認する必要がある割り当てがあります。円周率の数字は、提供されたスペースで区切られたテキストファイルに保存されます。かなり簡単に思えます。入力を配列に分割し、円周率の数字を配列に読み込んで、一致するものが見つかったかどうかを確認します。簡単に言えば、私はプログラムを満足のいくように機能させました。円周率の桁数が10、100の倍数など、最大100万桁のテキストドキュメントが提供されました。私のプログラムは最大100,000桁で動作します。しかし、何らかの理由で、100万桁のファイルでは、一般的なWindowsエラーでクラッシュします。クラッシュする理由についての情報がなく、エラーメッセージも表示されません(一般的な「問題が原因でこのプログラムが動作を停止しました」というメッセージを除く)。

割り当て状態の制限に注意して、cin、cout、およびファイルストリームオブジェクト以外のオブジェクト指向コードを使用することはできません(この制限は、まだクラスに参加しておらず、知らないうちに関数を使用することを望まないためです。それらがどのように機能するか)。

とにかく、私はプログラムがクラッシュする理由についての洞察を探しています。私はそれらを必要とするすべての変数(カウンターと関数の戻り値を含む)に長いintを使用しています。これは、約20億に達する可能性があり、ここでは100万を超える数であってはならないためです。

助けてくれてありがとう。私はここ数時間ここにいましたが、成功しませんでした。

const long int numberOfDigits = 1000000;
int digitsOfPi[numberOfDigits];
4

1 に答える 1

7
int digitsOfPi[numberOfDigits];

スタックには、このような大きな配列を保持するための十分なスペースがありません。スタックは、自動変数(AKA ローカル変数) が格納される場所です。メモリは、実行が関数に入るとローカル変数に自動的に割り当てられ、関数が戻ると解放されます。この自動メモリ管理により、スタックは優れていますが、サイズが制限されているという 1 つの制限があります。

大きなオブジェクトはヒープに置く必要があります。1ヒープは、好きなときに動的にピースを割り当てることができる巨大なメモリ プールです。ヒープとスタックの違いは、ヒープ メモリの割り当てと解放を担当することです。自動的に解放されるわけではありません。

C++ でヒープにメモリを割り当てるには、不要になったメモリを解放するために対応するnewそれぞれの演算子を使用します。(または、私たちの場合、配列を扱っているのでandを使用します。)newdeletenew[]delete[]

// Allocate memory on the heap.
int *digitsOfPi = new int[numberOfDigits];

// Use it.

// Then free it.
delete[] digitsOfPi;

// Or better yet, once you're allowed to use the STL...
std::vector<int> digitsOfPi;

しかし、より大きな問題は、なぜ π のすべての桁を一度にメモリに読み込む必要があるのか​​ということです。より優れた設計は、コード化が難しくなりますが、一定の O(1) 量のメモリ (一度に 7 桁など) しか必要ありません。

こちらもご覧ください


1コンパイラのオプションを調べてスタック サイズを増やすこともできますが、それは適切な解決策ではありません。

于 2013-01-16T04:23:23.193 に答える