Warum erhalte ich die Fehlermeldung "Objekt mit variabler Größe darf nicht initialisiert werden" mit dem folgenden Code?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Warum erhalte ich die Fehlermeldung "Objekt mit variabler Größe darf nicht initialisiert werden" mit dem folgenden Code?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Antworten:
Ich gehe davon aus, dass Sie einen C99-Compiler verwenden (mit Unterstützung für Arrays mit dynamischer Größe). Das Problem in Ihrem Code ist, dass der Compiler zu dem Zeitpunkt, an dem er Ihre Variablendeklaration sieht, nicht wissen kann, wie viele Elemente sich im Array befinden (ich gehe auch hier davon aus, dass der Compilerfehler length
keine Kompilierungszeitkonstante ist).
Sie müssen dieses Array manuell initialisieren:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
kompiliert gut. Der Compiler kennt die Größen und weiß, an welcher Position im Speicher sich das (1,2) -te Element befindet. Wenn Sie die dynamische Zuordnung verwenden, ist das Array eindimensional und Sie müssen die Mathematik selbst durchführen:printf("%d", boardAux[ 1*length + 2 ])
memset
Aufruf hingewiesen haben. Ich habe es gerade korrigiert.
length
zu sein static
? In C ++ 14 funktioniert es gut.
Sie erhalten diesen Fehler, weil Sie in der Sprache C keine Initialisierer mit Arrays variabler Länge verwenden dürfen. Die Fehlermeldung, die Sie erhalten, sagt im Grunde alles.
6.7.8 Initialisierung
...
3 Der Typ der zu initialisierenden Entität muss ein Array unbekannter Größe oder ein Objekttyp sein, der kein Array-Typ variabler Länge ist.
Dies gibt Fehler:
int len;
scanf("%d",&len);
char str[len]="";
Dies gibt auch Fehler:
int len=5;
char str[len]="";
Aber das funktioniert gut:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Sie müssen den Wert folgendermaßen setzen:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Nach dem Deklarieren des Arrays
int boardAux[length][length];
Die einfachste Möglichkeit, die Anfangswerte als Null zuzuweisen, ist die Verwendung der for-Schleife, auch wenn sie etwas langwierig sein kann
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
ist einfacher und schneller.
Die Frage ist bereits beantwortet, aber ich wollte auf eine andere Lösung hinweisen, die schnell ist und funktioniert, wenn die Länge zur Laufzeit nicht geändert werden soll. Verwenden Sie das Makro #define vor main (), um die Länge zu definieren, und in main () funktioniert Ihre Initialisierung:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Makros werden ausgeführt, bevor die eigentliche Kompilierung und Länge eine Kompilierungszeitkonstante sind (wie von David Rodríguez in seiner Antwort angegeben). Vor dem Kompilieren wird die Länge durch 10 ersetzt.
Deklarieren Sie einfach die Länge als Nachteil. Wenn dies nicht der Fall ist, sollten Sie den Speicher dynamisch zuweisen
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;
}
Für C ++ separate Deklaration und Initialisierung wie folgt.
int a[n][m] ;
a[n][m]= {0};
Du kannst das nicht machen. Der C-Compiler kann so etwas auf dem Stapel nicht ausführen.
Sie müssen Heap und dynamische Zuordnung verwenden.
Was Sie wirklich tun müssen:
Verwenden Sie * access (boardAux, x, y, size) = 42, um mit der Matrix zu interagieren.