2013-02-21 1 views
43

Sto avendo il seguente problema con il mio codice:Array [n] vs Array [10] - L'inizializzazione array con variabile vs numero reale

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

restituisce il seguente errore:

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

Mentre utilizzando double tenorData[10] funziona.

Qualcuno sa perché?

+4

Sarebbe utile dare una lingua. In C++ gli array di quella forma devono avere una dimensione costante in fase di compilazione. – OrangeAlmondSoap

+0

C++, usando i Codeblock con il compilatore mingw32-g ++! – msmf14

+0

Grazie, Justin e @AndrewVarnerin, questo l'ha risolto! aggiunto const prima dell'int: const int n = 10; Risolto! – msmf14

risposta

106

In C++, gli array di lunghezza variabile non sono legali. G ++ permette questo come una "estensione" (perché C permette), quindi in G ++ (senza essere -pedantic di seguire lo standard C++), si può fare:

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

Se si desidera una "matrice di lunghezza variabile" (meglio chiamato un "allineamento dimensioni in modo dinamico" in C++, in quanto adeguati gli array di lunghezza variabile non sono ammessi), hai per allocare dinamicamente la memoria da soli:

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

o, meglio ancora, usare un contenitore standard:

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

Se si vuole ancora un allineamento corretto, è possibile utilizzare una costante , non un variabile, durante la creazione di esso:

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

Allo stesso modo, se si vuole ottenere la dimensione da una funzione in C + +11, è possibile utilizzare uno constexpr:

constexpr int n() 
{ 
    return 10; 
} 

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

Grazie, questa è un'altra buona soluzione. Ciò di cui ho davvero bisogno alla fine è un vettore piuttosto che un array! – msmf14

+0

@ msmf14: Sì, i contenitori standard, come 'vector', sono incredibilmente utili. – Cornstalks

+0

La soluzione vettoriale inizializza ogni elemento quando si chiama "std :: vector <[some class]> a (n);"? – Justin