113 votes

Array[n] vs Array[10] - Initialisation d'un tableau avec une variable vs un littéral numérique

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] travaux.

Quelqu'un sait pourquoi ?

234voto

Cornstalks Points 9261

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

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

Si vous voulez un "tableau à longueur variable" (mieux appelé "tableau à taille dynamique" en C++, puisque les tableaux à longueur variable ne sont pas autorisés), vous devez soit allouer dynamiquement 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 récipient standard :

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

Si vous souhaitez tout de même un véritable tableau, vous pouvez utiliser un fichier constant et non un 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 la même manière, si vous souhaitez obtenir la taille d'une fonction en C++11, vous pouvez utiliser la fonction constexpr :

constexpr int n()
{
    return 10;
}

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X