Saya ingin membuat tiga array dengan panjang yang sama. Menurut dokumentasi , Array harus didefinisikan sebagai di int myArray[10];
mana 10 dapat diganti dengan panjang yang diketahui (integer lain), atau diisi dengan array {2, 3, 5, 6, 7}
.
Namun, ketika saya mencoba untuk menyatakan nilai int arrSize = 10;
dan kemudian sebuah array berdasarkan ukuran yang int myArray[arrSize];
, saya mendapatkan berikut: error: array bound is not an integer constant
.
Apakah ada cara untuk menentukan ukuran array secara variatif, atau apakah saya hanya perlu melakukan hardcode? (Saya diajarkan bahwa hardcoding itu buruk dan sesuatu yang harus dihindari dengan cara apa pun.)
programming
variables
code-optimization
pengguna3.1415927
sumber
sumber
Jawaban:
Pertanyaan Anda sebenarnya memiliki 2 bagian.
1 / Bagaimana saya bisa mendeklarasikan ukuran konstan array di luar array?
Anda bisa menggunakan makro
atau gunakan konstanta
jika Anda menginisialisasi array dan Anda perlu tahu ukurannya maka Anda bisa melakukannya:
yang kedua
sizeof
adalah pada jenis setiap elemen array Anda, di siniint
.2 / Bagaimana saya bisa memiliki array yang ukurannya dinamis (tidak diketahui sampai runtime)?
Untuk itu Anda perlu alokasi dinamis, yang berfungsi pada Arduino, tetapi umumnya tidak disarankan karena ini dapat menyebabkan "tumpukan" menjadi terfragmentasi.
Anda dapat melakukan (cara C):
Atau (C ++ way):
Untuk lebih lanjut tentang masalah dengan tumpukan tumpukan, Anda bisa merujuk ke pertanyaan ini .
sumber
ARRAY_SIZE = sizeof myArray / sizeof myArray[0];
, dengan cara ini Anda dapat mengubah jenis myArray tanpa memperkenalkan bug. Untuk alasan yang samamyArray = realloc(myArray, size * sizeof *myArray);
,. BTW, casting nilai kembalimalloc()
ataurealloc()
tidak berguna juga. 2) MemeriksamyArray != 0
versi C tidak ada gunanya,realloc(NULL, sz)
sama denganmalloc(sz)
.Ukuran array harus diketahui pada waktu kompilasi. Kalau tidak, Anda harus mengalokasikan memori secara dinamis menggunakan:
di mana x (bilangan bulat) dapat diatur dalam kode aplikasi (Anda dapat memuatnya dari eeprom jika Anda menginginkannya sebagai pengaturan yang persisten tetapi dapat dikonfigurasi).
Namun jika Anda hanya ingin mendeklarasikan beberapa array dengan ukuran yang sama, Anda hanya perlu mendeklarasikan angka dengan konstanta seperti ini:
Saya pikir tidak meng-hardcoding hal-hal hanya masuk akal jika Anda cukup berharap pengguna ingin mengubah pengaturan di beberapa titik. Saya tidak tahu apakah itu masalahnya.
sumber
Jika Anda tahu panjang maksimum array, inisialisasi saja array dengan panjang itu dan gunakan integer untuk memberi tahu program berapa banyak array yang digunakan. Jika perbedaannya antara 7,10 byte maka Anda tidak membuang banyak alokasi memori.
sumber
Saya tahu saya sedikit terlambat di sini, tetapi secara teori array reguler tidak dapat dibuat menggunakan variabel untuk menentukan jumlah elemen array akan memiliki seperti dalam:
Ini akan menampilkan kesalahan karena ketika mendeklarasikan array, program mengharapkan nilai antara tanda kurung menjadi konstan. Namun, ada cara di mana Anda dapat membuat array dengan variabel yang mendefinisikan jumlah nilai array ini akan memiliki melalui alokasi memori dinamis untuk set nilai (metode ini telah diuji dengan hanya array monodimensional, belum mencoba untuk multidimensi), dan itu berlangsung seperti ini:
Setelah ini, yang harus dilakukan hanyalah menetapkan nilai untuk setiap elemen yang dibuat dalam instance myArray (yang sudah menjadi Array sekarang) seperti yang Anda lakukan untuk array normal yang dibuat sebagai myArray [arrSize].
sumber