Dizi [n] - Dizi [10] - Değişken ve gerçek sayı ile dizi başlatma


91

Kodumla şu sorunu yaşıyorum:

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

Aşağıdaki hatayı döndürür:

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

Halbuki double tenorData[10]eserler kullanmak .

Nedenini bilen var mı?


4
Bir dil vermek yardımcı olur. C ++ 'da, bu formdaki dizilerinizin derleme zamanı sabit boyutuna sahip olması gerekir.
OrangeAlmondSoap

Mingw32-g ++ derleyicisi ile Codeblocks kullanarak C ++!
msmf14

Teşekkürler Justin ve @AndrewVarnerin, bu sorunu çözdü! int'den önce const eklendi: const int n = 10; Çözüldü!
msmf14

Yanıtlar:


189

C ++ 'da, değişken uzunluklu diziler yasal değildir. G ++ buna bir "uzantı" olarak izin verir (çünkü C buna izin verir), bu nedenle G ++ 'da ( -pedanticC ++ standardına uymadan) şunları yapabilirsiniz:

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

Bir "değişken uzunluklu dizi" istiyorsanız (uygun değişken uzunluklu dizilere izin verilmediğinden, C ++ 'da daha iyi "dinamik boyutlu dizi" olarak adlandırılır), belleği dinamik olarak kendiniz ayırmalısınız:

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

Veya daha iyisi standart bir kap kullanın:

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

Hala uygun bir dizi istiyorsanız, onu oluştururken bir değişken değil, bir sabit kullanabilirsiniz :

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

Benzer şekilde, boyutu C ++ 11'deki bir işlevden almak istiyorsanız, şunu kullanabilirsiniz constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
Teşekkür ederim, bu başka bir iyi çözüm. Sonunda gerçekten ihtiyacım olan şey bir diziden çok bir vektör!
msmf14

1
@ msmf14: Evet, gibi standart kapsayıcılar vectorinanılmaz derecede kullanışlıdır.
Cornstalks

Vektör çözümü, "std :: vektör <[bir sınıf]> a (n);" çağırdığınızda her bir elemanı başlatır mı?
Justin

3
Fazla ayırmıyorsanız (yığın boyutuna göre küçükse), alloca (3) ile yığın belleği ve yeni yerleşimi kullanmayı tercih ederim. Bu şekilde hafızayı serbest bırakma konusunda endişelenmenize gerek kalmaz ve hafıza ayırma çok daha hızlıdır.
holgac

2
G ++ 'nın buna izin verdiğinden bahsetmek için +1. Çünkü bu hatayı gözlemlemedim ve bu farkı açıklıyor.
gebbissimo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.