Dlaczego pojawia się błąd „Nie można zainicjować obiektu o zmiennej wielkości” za pomocą następującego kodu?
int boardAux[length][length] = {{0}};
Dlaczego pojawia się błąd „Nie można zainicjować obiektu o zmiennej wielkości” za pomocą następującego kodu?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Odpowiedzi:
Zakładam, że używasz kompilatora C99 (z obsługą tablic o dynamicznych rozmiarach). Problem w twoim kodzie polega na tym, że w momencie, gdy kompilatory widzą twoją deklarację zmiennej, nie mogą wiedzieć, ile elementów znajduje się w tablicy (zakładam również tutaj, na podstawie błędu kompilatora, który length
nie jest stałą czasową kompilacji).
Musisz ręcznie zainicjować tę tablicę:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
kompiluje się dobrze. Kompilator zna rozmiary i wie, w jakiej pozycji w pamięci znajduje się (1,2) -ty element. Jeśli korzystasz z alokacji dynamicznej, tablica jest jednowymiarowa i musisz wykonać obliczenia samodzielnie:printf("%d", boardAux[ 1*length + 2 ])
memset
wezwaniu. Właśnie to poprawiłem.
length
się static
? W C ++ 14 działa dobrze.
Ten błąd pojawia się, ponieważ w języku C nie możesz używać inicjatorów z tablicami o zmiennej długości. Komunikat o błędzie, który otrzymujesz, w zasadzie mówi wszystko.
6.7.8 Inicjalizacja
...
3 Typ obiektu, który ma zostać zainicjowany, powinien być tablicą o nieznanym rozmiarze lub typem obiektu, który nie jest typem tablicy o zmiennej długości.
To daje błąd:
int len;
scanf("%d",&len);
char str[len]="";
Daje to również błąd:
int len=5;
char str[len]="";
Ale to działa dobrze:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Musisz podać wartość w następujący sposób:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Po zadeklarowaniu tablicy
int boardAux[length][length];
najprostszym sposobem przypisania początkowych wartości jako zera jest użycie pętli for, nawet jeśli może to być trochę za długie
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
jest prostsze i szybsze.
Odpowiedź na to pytanie jest już dostępna, ale chciałem wskazać inne rozwiązanie, które jest szybkie i działa, jeśli długość nie ma być zmieniana w czasie wykonywania. Użyj makra #define przed main (), aby zdefiniować długość, aw main () inicjalizacja zadziała:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Makra są uruchamiane przed właściwą kompilacją, a długość będzie stałą czasu kompilacji (o czym wspomina David Rodríguez w swojej odpowiedzi). W rzeczywistości zastąpi on długość 10 przed kompilacją.
Po prostu zadeklaruj długość jako wadę, jeśli tak nie jest, powinieneś alokować pamięć dynamicznie
const int lenght=5; int array[length][length] = {{0}};
nie będzie.
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;
}
Dla oddzielnej deklaracji C ++ i inicjalizacji w ten sposób ...
int a[n][m] ;
a[n][m]= {0};
Nie możesz tego zrobić. Kompilator C nie może zrobić tak złożonej rzeczy na stosie.
Musisz użyć sterty i alokacji dynamicznej.
Co naprawdę musisz zrobić:
Użyj * access (boardAux, x, y, size) = 42 do interakcji z macierzą.