次のコードで「可変サイズのオブジェクトが初期化されていない可能性があります」というエラーが表示されるのはなぜですか?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
次のコードで「可変サイズのオブジェクトが初期化されていない可能性があります」というエラーが表示されるのはなぜですか?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
回答:
私はC99コンパイラを使用していると仮定しています(動的にサイズが設定された配列をサポートしています)。あなたのコードの問題は、コンパイラが変数宣言を見るときに、配列に要素がいくつあるかを知ることができないということです(ここでも、length
コンパイル時定数ではないコンパイラエラーから想定しています)。
その配列を手動で初期化する必要があります。
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
正常にコンパイルします。コンパイラーはサイズを認識し、メモリー内の(1,2)番目の要素がどの位置にあるかを認識します。あなたが動的割り当てを使用する場合は、アレイは、一次元であり、あなたは数学を自分で実行する必要がありますprintf("%d", boardAux[ 1*length + 2 ])
memset
コールアウトでエラーを指摘してくれてありがとう。修正しました。
length
と、C99コンパイラでこのエラーが発生するのはなぜstatic
ですか?C ++ 14では正常に動作します。
C言語では、可変長配列でイニシャライザを使用できないため、このエラーが表示されます。あなたが得ているエラーメッセージは基本的にそれをすべて言います。
6.7.8初期化
...
3初期化するエンティティのタイプは、サイズが不明な配列か、可変長配列タイプではないオブジェクトタイプでなければなりません。
これはエラーになります:
int len;
scanf("%d",&len);
char str[len]="";
これもエラーになります:
int len=5;
char str[len]="";
しかし、これはうまくいきます:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
次の方法で値を設定する必要があります。
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
配列を宣言した後
int boardAux[length][length];
初期値をゼロとして割り当てる最も簡単な方法は、たとえ少し長くてもforループを使用することです
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
シンプルで高速です。
int size=5;
int ar[size ]={O};
/* This operation gives an error -
variable sized array may not be
initialised. Then just try this.
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
ar[i]=0;
}
C ++の場合、このように個別の宣言と初期化を行います。
int a[n][m] ;
a[n][m]= {0};
できません。Cコンパイラはスタックでこのような複雑なことを行うことはできません。
ヒープと動的割り当てを使用する必要があります。
あなたが本当に必要なこと:
* access(boardAux、x、y、size)= 42を使用して、マトリックスを操作します。