Array [n] vs Array [10] - Inizializzazione di array con variabile rispetto a numero reale


91

Sto riscontrando il seguente problema con il mio codice:

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 usando double tenorData[10]works.

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

C ++, utilizzando Codeblocks con il compilatore mingw32-g ++!
msmf14

Grazie, Justin e @AndrewVarnerin, questo ha risolto il problema! const aggiunto prima di int: const int n = 10; Risolto!
msmf14

Risposte:


196

In C ++, gli array di lunghezza variabile non sono legali. G ++ lo consente come "estensione" (perché C lo consente), quindi in G ++ (senza -pedanticseguire lo standard C ++), puoi fare:

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

Se si desidera un "array di lunghezza variabile" (meglio chiamato "array di dimensioni dinamiche" in C ++, poiché non sono consentiti array di lunghezza variabile appropriati), è necessario allocare dinamicamente la memoria:

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

O, meglio ancora, usa un contenitore standard:

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

Se vuoi ancora un array corretto, puoi usare una costante , non una variabile , quando lo crei:

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 vuoi ottenere la dimensione da una funzione in C ++ 11, puoi usare 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 veramente bisogno alla fine è un vettore piuttosto che un array!
msmf14

1
@ msmf14: Sì, i contenitori standard, come vector, sono incredibilmente utili.
Steli di mais

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

3
Se non stai allocando molto (se è piccolo rispetto alla dimensione dello stack), preferirei usare la memoria dello stack con alloca (3) e il posizionamento nuovo. In questo modo non devi preoccuparti di liberare la memoria e l'allocazione della memoria è molto più veloce.
holgac

2
+1 per aver menzionato che g ++ lo consente. Perché non ho osservato questo errore e questo spiega la differenza.
gebbissimo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.