1

ユーザーから特定の数の値を取得しようとしています。これを行うには、簡単な方法で、入力する特定の数の値を入力するようにユーザーに依頼しました。この量の値は変数に保存されます (例: " x ":

int x;
printf("Enter the number of values to be entered: ");
scanf("%d", &x);
int array[x];

したがって、コードを実行しようとすると、次のメッセージが表示されます。

定数式が必要

なぜこれが起こるのですか?どうすれば修正できますか?

4

4 に答える 4

3

この宣言:

int array[x];

可変長配列( VLA)であり、C99機能です。サポートがないVLA場合、配列サイズはコンパイル時の定数でなければなりません。これDrDobb's articleVLA参考になります。

と の両方を使用していたBorland C++とのことですがXcodeBorland最後のバージョンが1997 年だったということは、この機能をサポートする可能性は低いことを意味しますが、多くの情報は見つかりません。ツールの最新のブランチを使用している場合は、C99 をサポートしていると主張しているため、サポートを有効にする方法があるかもしれません。

Xcode私が理解している限り、モード、非 C99 モード、および C++ でサポートされているいずれかclangまたは両方を使用できます。gccVLAc99gcc supports VLA as an extensionclang supports this as well in limited cases

両方のコンパイラで開発する必要がある場合は、C や C++VLAなどの動的にサイズ変更された配列の代替方法を放棄して使用する必要がある場合があり、多くの状況ではおそらく正しい選択です。mallocstd::vector

于 2013-08-14T03:13:42.867 に答える
3
int array[x];

xコンパイル時の定数ではなく、コンパイラはそれについて不平を言っています。可変長配列は C99 標準の一部です。コンパイラが標準に準拠していないようです。

を使用mallocして、配列を動的に割り当て、後でfreeそれを割り当てることができます。または、VLA をサポートするコンパイラを使用してください。

于 2013-08-14T02:29:31.600 に答える
2

免責事項: 「宣言」と「定義」という 2 つの用語の違いに関しては、多くのあいまいさがあります。あいまいさを私とは異なる方法で解釈する場合は、違いを説明するために使用する例に注意してください。


完全を期すために:

可変長配列 ( VLA ) の宣言は、C99 では完全に有効です。

int n;

scanf( "%d", &n );

int arr[ n ];

...問題は、使用しているコンパイラまたは指定したフラグにある可能性があります。別の方法として、メモリ プールとmalloc十分な大きさのメモリ ブロック ( n * sizeof( int ))を使用し、使いfree終わったらメモリ ブロックを使用する方法があります。

元のコードに戻ると、可変長配列の宣言のみが有効であり、定義は無効であることに注意することが非常に重要です。たとえば、可変長配列を宣言し、すべての要素をゼロで埋めたいとします。次のことができませんでした:

int n;

scanf( "%d", &n );

int arr[ n ] = { 0 }; // Invalid.

...あなたが定義しているようにarr。次のことを行う必要があります。

int n;

scanf( "%d", &n );

int arr[ n ]; // Valid.

// Zero-fills the array.
for ( int i = 0; i < n; i++ ) {
  arr[ i ] = 0;
}
于 2013-08-14T02:44:26.893 に答える
0
<!-- language:C -->
/*maybe you can like this*/
int x;
int *p;
printf("Enter the number of value to be Entered:");
scanf("%d", &x);
p = (int *)malloc(sizeof(int) * x);

//p[0 - (x-1)] can be used
于 2013-08-14T03:36:26.747 に答える