Warum erhalte ich die Fehlermeldung "Objekt mit variabler Größe darf nicht initialisiert werden" mit dem folgenden Code?
int boardAux[length][length] = {{0}};
c
compiler-errors
initializer-list
variable-length-array
Hallo Welt
quelle
quelle
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:
quelle
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 seinstatic
? 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.
quelle
Dies gibt Fehler:
Dies gibt auch Fehler:
Aber das funktioniert gut:
Sie müssen den Wert folgendermaßen setzen:
quelle
Nach dem Deklarieren des Arrays
Die einfachste Möglichkeit, die Anfangswerte als Null zuzuweisen, ist die Verwendung der for-Schleife, auch wenn sie etwas langwierig sein kann
quelle
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:
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.
quelle
Deklarieren Sie einfach die Länge als Nachteil. Wenn dies nicht der Fall ist, sollten Sie den Speicher dynamisch zuweisen
quelle
quelle
Für C ++ separate Deklaration und Initialisierung wie folgt.
quelle
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.
quelle