Mengapa saya menerima pesan kesalahan "Objek berukuran variabel mungkin tidak dimulai" dengan kode berikut?
int boardAux[length][length] = {{0}};
c
compiler-errors
initializer-list
variable-length-array
Halo Dunia
sumber
sumber
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:
sumber
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
menjadistatic
? 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.
sumber
Ini memberikan kesalahan:
Ini juga memberikan kesalahan:
Tapi ini berfungsi dengan baik:
Anda perlu memberi nilai dengan cara berikut:
sumber
Setelah mendeklarasikan array
cara termudah untuk menetapkan nilai awal sebagai nol adalah menggunakan for loop, meskipun mungkin agak panjang
sumber
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:
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.
sumber
Cukup nyatakan panjang sebagai kontra, jika tidak maka Anda harus mengalokasikan memori secara dinamis
sumber
sumber
Untuk C ++ deklarasi dan inisialisasi terpisah seperti ini ..
sumber
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.
sumber