Array [n] vs Array [10] - Initialisation du tableau avec variable vs nombre réel

91

Je rencontre 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

Alors que l'utilisation double tenorData[10]fonctionne.

Quelqu'un sait pourquoi?

msmf14
la source
4
Cela aiderait à donner une langue. En C ++, vos tableaux de cette forme doivent avoir une taille constante à la compilation.
OrangeAlmondSoap
C ++, en utilisant Codeblocks avec le compilateur mingw32-g ++!
msmf14
Merci, Justin et @AndrewVarnerin, cela a résolu le problème! ajouté const avant le int: const int n = 10; Résolu!
msmf14

Réponses:

189

En C ++, les tableaux de longueur variable ne sont pas autorisés. G ++ permet cela comme une "extension" (car C le permet), donc en G ++ (sans être -pedanticsur le point de suivre le standard 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 ++, puisque les tableaux de longueur variable appropriés 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 conteneur standard:

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

Si vous voulez toujours un tableau approprié, 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 souhaitez obtenir la taille d'une fonction en C ++ 11, vous pouvez utiliser un constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
Tiges de maïs
la source
1
Merci, c'est une autre bonne solution. Ce dont j'ai vraiment besoin à la fin, c'est d'un vecteur plutôt que d'un tableau!
msmf14
1
@ msmf14: Ouais, les conteneurs standard, comme vector, sont incroyablement utiles.
Cornstalks
La solution vectorielle initialise-t-elle chaque élément lorsque vous appelez "std :: vector <[une classe]> a (n);"?
Justin
3
Si vous n'allouez pas beaucoup (si c'est petit par rapport à la taille de la pile), je préférerais utiliser la mémoire de pile avec alloca (3) et le placement nouveau. De cette façon, vous n'avez pas à vous soucier de libérer de la mémoire et l'allocation de mémoire est beaucoup plus rapide.
holgac
2
+1 pour avoir mentionné que g ++ le permet. Parce que je n'ai pas observé cette erreur et cela explique la différence.
gebbissimo le