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}};
c
compiler-errors
initializer-list
variable-length-array
Witaj świecie
źródło
źródło
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ę:
źródło
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.
źródło
To daje błąd:
Daje to również błąd:
Ale to działa dobrze:
Musisz podać wartość w następujący sposób:
źródło
Po zadeklarowaniu tablicy
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
źródło
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:
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ą.
źródło
Po prostu zadeklaruj długość jako wadę, jeśli tak nie jest, powinieneś alokować pamięć dynamicznie
źródło
const int lenght=5; int array[length][length] = {{0}};
nie będzie.źródło
Dla oddzielnej deklaracji C ++ i inicjalizacji w ten sposób ...
źródło
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ą.
źródło