Mengapa saya menerima pesan kesalahan "Objek berukuran variabel mungkin tidak dimulai" dengan kode berikut?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Mengapa saya menerima pesan kesalahan "Objek berukuran variabel mungkin tidak dimulai" dengan kode berikut?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Jawaban:
Saya berasumsi bahwa Anda menggunakan kompiler C99 (dengan dukungan untuk array berukuran dinamis). Masalah dalam kode Anda adalah bahwa pada saat kompiler melihat deklarasi variabel Anda, ia tidak dapat mengetahui berapa banyak elemen yang ada dalam array (saya juga mengasumsikan di sini, dari kesalahan kompiler yang length
bukan konstanta waktu kompilasi).
Anda harus menginisialisasi array itu secara manual:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
kompilasi dengan baik. Kompilator mengetahui ukurannya dan mengetahui di posisi apa elemen (1,2) dalam memori itu. Jika Anda menggunakan alokasi dinamis, lariknya uni-dimensional dan Anda harus menghitung sendiri:printf("%d", boardAux[ 1*length + 2 ])
memset
menelepon. Saya baru saja memperbaikinya.
length
menjadi static
? Di C ++ 14 ini berfungsi dengan baik.
Anda menerima kesalahan ini karena dalam bahasa C Anda tidak diperbolehkan menggunakan penginisialisasi dengan array panjang variabel. Pesan kesalahan yang Anda dapatkan pada dasarnya mengatakan itu semua.
6.7.8 Inisialisasi
...
3 Jenis entitas yang akan diinisialisasi adalah larik dengan ukuran tidak diketahui atau tipe objek yang bukan jenis larik dengan panjang variabel.
Ini memberikan kesalahan:
int len;
scanf("%d",&len);
char str[len]="";
Ini juga memberikan kesalahan:
int len=5;
char str[len]="";
Tapi ini berfungsi dengan baik:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Anda perlu memberi nilai dengan cara berikut:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Setelah mendeklarasikan array
int boardAux[length][length];
cara termudah untuk menetapkan nilai awal sebagai nol adalah menggunakan for loop, meskipun mungkin agak panjang
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
lebih sederhana dan lebih cepat.
Pertanyaannya sudah dijawab tetapi saya ingin menunjukkan solusi lain yang cepat dan berfungsi jika panjang tidak dimaksudkan untuk diubah pada saat run-time. Gunakan makro #define before main () untuk menentukan panjang dan di main () inisialisasi Anda akan bekerja:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Makro dijalankan sebelum kompilasi aktual dan panjangnya akan menjadi konstanta waktu kompilasi (seperti yang dirujuk oleh David Rodríguez dalam jawabannya). Ini sebenarnya akan menggantikan panjang dengan 10 sebelum kompilasi.
Cukup nyatakan panjang sebagai kontra, jika tidak maka Anda harus mengalokasikan memori secara dinamis
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;
}
Untuk C ++ deklarasi dan inisialisasi terpisah seperti ini ..
int a[n][m] ;
a[n][m]= {0};
Kamu tidak dapat melakukannya. Kompiler C tidak dapat melakukan hal yang rumit pada stack.
Anda harus menggunakan heap dan alokasi dinamis.
Apa yang benar-benar perlu Anda lakukan:
Gunakan * akses (boardAux, x, y, size) = 42 untuk berinteraksi dengan matriks.