2010-06-21 16 views

Antwort

71

Ich gehe davon aus, dass Sie einen C99-Compiler verwenden (mit Unterstützung für dynamisch große Arrays). Das Problem in Ihrem Code ist, dass zu dem Zeitpunkt, wenn der Compiler Ihre Variablendeklaration sieht, er nicht wissen kann, wie viele Elemente es im Array gibt (ich nehme auch hier an, dass der Compilerfehler length keine Kompilierzeitkonstante ist).

Sie müssen manuell das Array initialisieren:

int boardAux[length][length]; 
memset(boardAux, 0, length*length*sizeof(int)); 
+0

Ich kann für diesen Zweck auch malloc verwenden, was ist mit der zweiten Frage, ich schrieb es nach Pavels Antwort – helloWorld

+0

@helloWorld: Mit Stapel zugewiesenen Arrays, 'printf ("% d ", boardAux [1] [2]) kompiliert fein. Der Compiler kennt die Größen und weiß, in welcher Position im Speicher sich das (1,2) -te Element befindet. Wenn Sie die dynamische Zuweisung verwenden, ist das Array eindimensional und Sie müssen die Berechnung selbst durchführen: 'printf ("% d ", boardAux [1 * Länge + 2])' –

+0

@AndreyT: Danke, dass Sie den Fehler im 'memset zeigen Ruf aus. Ich habe es gerade korrigiert. –

-5

Sie können es nicht tun. C-Compiler kann solch eine komplexe Sache nicht auf Stapel ausführen.

Sie müssen Heap und dynamische Zuordnung verwenden.

Was Sie wirklich tun müssen:

  • Rechengröße (n m sizeof (Element)) des Speichers Sie
  • Aufruf malloc (Größe) müssen die Speicher
  • erstellen zuzuteilen ein Accessor: int * Zugriff (ptr, x, y, rowSize) {Rückgabe ptr + y * rowSize + x; }

Verwenden * Zugriff (boardAux, x, y, Größe) = 42 mit der Matrix interagieren.

+0

eine weitere Frage, warum erhalte ich einen Fehler ungültige Verwendung von Array mit unspezifizierten Grenzen? printf ("% d", Karte [i] [j]); – helloWorld

+7

-1 C99 ermöglicht die dynamische Zuordnung im Stack als Benutzercode (ohne Initialisierung). Es müssen keine dynamischen Zuordnungen vorgenommen werden. –

+0

@helloWorld, weil Array-Dimensionen bekannt sein müssen. –

17

Sie diesen Fehler erhalten, weil in C-Sprache Sie sind nicht erlaubt initializers mit variabler Länge Arrays zu verwenden. Die Fehlermeldung, die Sie erhalten, sagt alles.

6.7.8 Initialization

...

3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

+0

wo hast du das gefunden, kannst du mir einen Link geben? – helloWorld

+1

@helloWorld: Dies ist vom Sprachstandard (C99). Sie können eine "funktionierende" Kopie mit TC3 Updates hier erhalten http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT

+3

Es gibt Themen, für die einige Sie immer ungläubig sind, wenn Sie geben Sie nur die informelle Erklärung an. Arrays mit variabler Länge sind eines dieser Themen. +1 für die Angabe des Standards. –

6

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 die folgenden setzen Wert in Weg:

str[0]='a'; 
str[1]='b'; //like that; and not like str="ab"; 
0

einfach Länge deklariert ein Nachteil zu sein, wenn es nicht so ist, sollten Sie dynamisch seine

+2

Ich denke du musst nachsehen was const bedeutet! – Holger

1

Nach Deklarieren dem Array

int boardAux[length][length]; 

die einfachste Art und Weise der Anfangswert als Null Zuweisung Speicher zuweisen verwendet für for-Schleife, auch wenn es ein wenig lang sein kann

int i, j; 
for (i = 0; i<length; i++) 
{ 
    for (j = 0; j<length; j++) 
     boardAux[i][j] = 0; 
} 
1

Für C++ separate Deklaration und Initialisierung wie t sein ..

int a[n][m] ; 
a[n][m]= {0}; 
Verwandte Themen