Array [n] vs Array [10] - Initialisierung des Arrays mit Variable vs reelle Zahl

86

Ich habe folgendes Problem mit meinem Code:

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

Gibt den folgenden Fehler zurück:

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

Während mit double tenorData[10]Arbeiten.

Weiß jemand warum?

msmf14
quelle
4
Es würde helfen, eine Sprache zu geben. In C ++ müssen Ihre Arrays dieser Form eine konstante Größe zur Kompilierungszeit haben.
OrangeAlmondSoap
C ++ mit Codeblocks mit dem Compiler mingw32-g ++!
msmf14
Danke, Justin und @AndrewVarnerin, das hat es gelöst! const vor dem int hinzugefügt: const int n = 10; Gelöst!
msmf14

Antworten:

182

In C ++ sind Arrays mit variabler Länge nicht zulässig. G ++ erlaubt dies als "Erweiterung" (weil C es erlaubt), also können Sie in G ++ (ohne -pedanticden C ++ - Standard zu befolgen) Folgendes tun:

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

Wenn Sie ein "Array mit variabler Länge" möchten (in C ++ besser als "Array mit dynamischer Größe" bezeichnet, da Arrays mit variabler Länge nicht zulässig sind), müssen Sie entweder selbst Speicher dynamisch zuweisen:

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

Oder, noch besser, verwenden Sie einen Standardcontainer:

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

Wenn Sie dennoch ein geeignetes Array wünschen, können Sie beim Erstellen eine Konstante und keine Variable verwenden :

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

Wenn Sie die Größe einer Funktion in C ++ 11 abrufen möchten, können Sie Folgendes verwenden constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
Maisstängel
quelle
1
Vielen Dank, dies ist eine weitere gute Lösung. Was ich am Ende wirklich brauche, ist eher ein Vektor als ein Array!
msmf14
1
@ msmf14: Ja, Standardcontainer, wie vector sind unglaublich nützlich.
Cornstalks
Initialisiert die Vektorlösung jedes Element, wenn Sie "std :: vector <[irgendeine Klasse]> a (n);" aufrufen?
Justin
3
Wenn Sie nicht viel zuweisen (wenn es im Vergleich zur Stapelgröße klein ist), würde ich es vorziehen, Stapelspeicher mit Zuweisung (3) zu verwenden und neu zu platzieren. Auf diese Weise müssen Sie sich keine Gedanken über die Freigabe des Speichers machen, und die Speicherzuweisung ist viel schneller.
Holgac
2
+1 für die Erwähnung, dass g ++ es erlaubt. Weil ich diesen Fehler nicht beobachtet habe und dies den Unterschied erklärt.
gebbissimo