web-dev-qa-db-fra.com

Tableau [n] vs Tableau [10] - Initialisation d'un tableau avec un nombre variable vs réel

J'ai le problème suivant avec mon code:

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

Renvoie l'erreur suivante:

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

Considérant que l'utilisation de double tenorData[10] fonctionne.

Quelqu'un sait pourquoi?

69
msmf14

En C++, les tableaux de longueur variable ne sont pas légaux. G ++ autorise cela comme une "extension" (parce que C le permet), donc en G ++ (sans être -pedantic sur le respect de la norme C++), vous pouvez faire:

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

Si vous voulez un "tableau de longueur variable" (mieux appelé "tableau de taille dynamique" en C++, car les tableaux de longueur variable appropriés ne sont pas autorisés), vous devez soit allouer de manière dynamique de la mémoire vous-même:

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

Ou, mieux encore, utilisez un conteneur standard:

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

Si vous voulez toujours un tableau correct, vous pouvez utiliser une constante, pas une variable, lors de sa création:

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

De même, si vous voulez obtenir la taille d'une fonction dans C++ 11, vous pouvez utiliser un constexpr:

constexpr int n()
{
    return 10;
}

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