1

私はCを使用してプロジェクトを行っており、CodeBlocksは私のIDEです。WindowsVistaがOSです。すでに機能しているコードにいくつかの新しいものを追加しましたが、実行可能ファイルが毎回クラッシュします。コンパイル後もエラーはありません。コンピュータとプログラミングは私の分野ではありませんが、それはある種のメモリ制限と関係があるのではないかと思います(それが存在し、意味がある場合)。私は3つの異なる3Dマトリックス/次元の配列を使用しているので、これを言います。

  • 1500x5x2
  • 1500x5x12
  • 1500x5x200

次に、両方とも次元1500の2つの1D配列がありました。これはすべて正常に機能していました。

すべての次元が1500x5の2Dマトリックス/配列をさらに3つ追加すると、クラッシュし始めました。既存のマトリックスのいくつかにコメントすると、新しいマトリックスは正常に機能しますが、一度に1つしか機能しません。

(ところで、上記で参照されているすべての行列はINT型であり、ポインターとcallocで定義されています)

助言がありますか?

4

5 に答える 5

6

プラットフォームなどには制限がありますが、3つの3Dマトリックスは数MBのRAM(6を少し超える)しか使用しないため、それらを考慮して制限に達しているとは思えません。

他のマトリックスを追加したときにクラッシュし始めた場合は、追加した新しいマトリックスコードを定義するポインターでメモリ割り当て/アクセスエラーが発生しているのではないかと疑っています。

マトリックスをどのように定義していますか?

- - 編集 - -

CodeBlocksでデバッグしてみてください。これにより、クラッシュが発生している場所が正確にわかります。

于 2009-03-13T17:14:32.770 に答える
1

配列が負の次元を持つ可能性があることを知りませんでした。

実際、配列の次元は、配置する予定の項目の数であるため、できないと確信しています。

于 2009-03-13T17:25:21.057 に答える
0

IDEのデバッガーの使用方法を学ぶことをお勧めします。まだ何もありません。

于 2009-03-13T17:23:36.630 に答える
0

実行可能ファイル (C で記述) を問題なく実行するには、何らかのメモリ制限がありますか?

32 ビット OS では、ポインターのサイズが 32 ビットであり、32 ビット ポインターでは 4GB しか参照できないため、プログラムは 4GB のメモリに制限されます (実際にはそれより少ないですが、これがハードな上限です)。

ただし、最大の配列は 6MB 未満しか消費しないため、これは問題にはなりません。これらの配列を数百個インスタンス化しても問題ありません。

C で動的多次元配列を作成するための標準的な方法にほぼ従っています。

int *** layer=calloc(lines, sizeof(int **));
for(i=0;i<lines;i++)
{ 
   layer[i]=calloc(columns, sizeof(int*));
   for(j=0;j<columns;j++) 
   { 
     layer[i][j]=calloc(hight, sizeof(int));
   }
}

だから私はあなたのコードの他の場所を見ます。デバッガを使用します。配列アクセスが範囲外に出ていないことを確認するか、そうでない場合は配列要素をポインターとして扱ってください。

-アダム

于 2009-03-13T18:13:34.577 に答える
0

クラッシュの種類を特定できますか?

どのようなメッセージが表示されますか?

上記の回答を引用します。

「IDE のデバッガーの使い方を学ぶことをお勧めします。実際にはまだ何もありません。」

考えられる原因を推測する代わりに、利用可能なツールを使用して問題を特定のコード行に絞り込みます。

問題を解決したことをコメントで確認しましたが、一般的には適切にデバッグすることが唯一のプログラミング方法であり、問​​題を投稿するときはできるだけ多くのコードと詳細を提供してください!

于 2009-08-26T16:27:00.750 に答える