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?


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.