array [n] vs array [10] – Initialiseren van array met variabele vs real-getal

Ik heb het volgende probleem met mijn code:

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

Retourneert de volgende fout:

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

Overwegende dat het gebruik van double tenorData[10]werkt.

Iedereen weet waarom?


Antwoord 1, Autoriteit 100%

In C++ zijn arrays variabele lengte niet legaal. G ++ Hiermee staat dit toe als een “extensie” (omdat C het toestaat), dus in G ++ (zonder -pedanticover het volgen van de C++ -standaard), kunt u doen:

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

Als u een “variabele lengte-array” wilt (beter genoemd een “dynamisch formaatarray” in C++, aangezien de juiste reeksen van de juiste variabele lengte niet zijn toegestaan), moet u ofwel het geheugen zelf toewijzen:

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

of, beter nog, gebruik een standaardcontainer:

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

Als u nog steeds een goede array wilt, kunt u een constante gebruiken, geen variabele , bij het maken van deze:

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

Evenzo, als u de grootte van een functie in C++11 wilt krijgen, kunt u een constexprgebruiken:

constexpr int n()
{
    return 10;
}
double a[n()]; // n() is a compile time constant expression

Other episodes