Neden aşağıdaki kodla "Değişken boyutlu nesne başlatılamayabilir" hatasını alıyorum?
int boardAux[length][length] = {{0}};
Neden aşağıdaki kodla "Değişken boyutlu nesne başlatılamayabilir" hatasını alıyorum?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Yanıtlar:
Bir C99 derleyicisi kullandığınızı varsayıyorum (dinamik boyutlu diziler için destekle). Kodunuzdaki sorun, derleyiciler değişken bildiriminizi gördüğünde, dizide kaç öğe olduğunu bilememesidir (burada ayrıca derleyici hatasından length
derleme zamanı sabiti olmayan varsayıyorum ).
Bu diziyi manuel olarak başlatmalısınız:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
iyi derler. Derleyici boyutları bilir ve hafızadaki (1,2) -ci elemanın hangi konumda olduğunu bilir. Dinamik ayırma kullanıyorsanız, dizi tek boyutludur ve matematiği kendiniz yapmanız gerekir:printf("%d", boardAux[ 1*length + 2 ])
memset
. Az önce düzelttim.
length
olmak static
? C ++ 14'te iyi çalışıyor.
malloc
gerekli olmadığını bilmek istiyorum .
Bu hatayı, C dilinde değişken uzunluklu dizilere sahip başlatıcıları kullanmanıza izin verilmediğinden alırsınız. Aldığınız hata mesajı temelde her şeyi söylüyor.
6.7.8 Başlatma
...
3 Başlatılacak varlığın türü, bilinmeyen boyutta bir dizi veya değişken uzunluklu dizi türü olmayan bir nesne türü olmalıdır.
Bu hata verir:
int len;
scanf("%d",&len);
char str[len]="";
Bu aynı zamanda hata verir:
int len=5;
char str[len]="";
Ama bu gayet iyi çalışıyor:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Aşağıdaki şekilde değer katmanız gerekir:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Diziyi bildirdikten sonra
int boardAux[length][length];
başlangıç değerlerini sıfır olarak atamanın en basit yolu, biraz uzun olsa bile for döngüsünü kullanmaktır
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
daha basit ve daha hızlıdır.
Soru zaten cevaplandı, ancak hızlı olan ve çalışma zamanında uzunluk değiştirilmek istenmiyorsa işe yarayan başka bir çözüme işaret etmek istedim. Uzunluğu tanımlamak için main () 'den önce makro #define kullanın ve main () içinde ilklendirmeniz çalışacaktır:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Makrolar, gerçek derlemeden önce çalıştırılır ve uzunluk bir derleme zamanı sabiti olacaktır (cevabında David Rodríguez tarafından bahsedildiği gibi). Derlemeden önce uzunluğu 10 ile değiştirecektir.
{0}
ve arasında gerçek bir fark var {{0}}
mı?
Uzunluğu bir eksiler olarak beyan edin, eğer değilse, o zaman belleği dinamik olarak ayırmalısınız.
const int lenght=5; int array[length][length] = {{0}};
olmayacak.
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;
}
C ++ için ayrı bildirim ve bunun gibi başlatma ..
int a[n][m] ;
a[n][m]= {0};
Bunu yapamazsın. C derleyicisi yığın üzerinde böyle karmaşık bir şey yapamaz.
Yığın ve dinamik ayırma kullanmanız gerekir.
Gerçekten yapmanız gerekenler:
Matrisle etkileşim kurmak için * access (boardAux, x, y, size) = 42 kullanın.