Array [n] vs Array [10] - Menginisialisasi array dengan variabel vs bilangan real

91

Saya mengalami masalah berikut dengan kode saya:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Mengembalikan kesalahan berikut:

error: variable-sized object 'tenorData' may not be initialized

Sedangkan menggunakan double tenorData[10]karya.

Ada yang tahu kenapa?

msmf14.dll
sumber
4
Ini akan membantu memberikan bahasa. Dalam C ++, array Anda dari formulir itu perlu memiliki ukuran konstan waktu kompilasi.
OrangeAlmondSoap
C ++, menggunakan Codeblocks dengan kompiler mingw32-g ++!
msmf14
Terima kasih, Justin dan @AndrewVarnerin, itu menyelesaikannya! menambahkan const sebelum int: const int n = 10; Terpecahkan!
msmf14

Jawaban:

189

Dalam C ++, array panjang variabel tidak legal. G ++ mengizinkan ini sebagai "ekstensi" (karena C mengizinkannya), jadi di G ++ (tanpa harus -pedanticmengikuti standar C ++), Anda dapat melakukan:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

Jika Anda menginginkan "larik panjang variabel" (lebih baik disebut "larik berukuran dinamis" dalam C ++, karena larik panjang variabel yang sesuai tidak diizinkan), Anda juga harus mengalokasikan memori sendiri secara dinamis:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

Atau, lebih baik lagi, gunakan wadah standar:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

Jika Anda masih menginginkan array yang tepat, Anda dapat menggunakan konstanta , bukan variabel , saat membuatnya:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

Demikian pula, jika Anda ingin mendapatkan ukuran dari fungsi di C ++ 11, Anda dapat menggunakan constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
Batang jagung
sumber
1
Terima kasih, ini adalah solusi bagus lainnya. Yang benar-benar saya butuhkan pada akhirnya adalah vektor daripada array!
msmf14
1
@ msmf14: Ya, wadah standar, seperti vector, sangat berguna.
Cornstalks
Apakah solusi vektor menginisialisasi setiap elemen saat Anda memanggil "std :: vector <[some class]> a (n);"?
Justin
3
Jika Anda tidak mengalokasikan banyak (jika kecil dibandingkan dengan ukuran tumpukan), saya lebih suka menggunakan memori tumpukan dengan alloca (3) dan penempatan baru. Dengan cara ini Anda tidak perlu khawatir tentang mengosongkan memori, dan alokasi memori jauh lebih cepat.
holgac
2
1 untuk menyebutkan bahwa g ++ mengizinkannya. Karena saya tidak melihat kesalahan ini dan ini menjelaskan perbedaannya.
gebbissimo