de taille variable objet ne peut pas être initialisé c++
Je comprends que cette question a été posée avant, mais je ne comprends pas pourquoi il ne fonctionne pas dans mon cas
void calc(vector<char> zodis1, vector<char> zodis2, vector<char> zodisAts,int zo1,int zo2,int zoA)
{
int i,u=0;
int zod1[zo1]=0;
int zod2[zo2]=0;
int zodA[zoA]=0;
}
Tous les 3 de zod1, zod2, zoA me donne l'erreur: variable-sized object may not be initialized c++
Mais le compilateur doit connaître le sens de la zo
avant l'initialisation de la cause cout<<zo1;
œuvres et imprimez le sens
Ainsi quel est le problème?
Pour être clair: dans la norme C++
int zod1[zo1];
n'est pas autorisée. Cependant, de nombreux compilateurs offrent que comme une extension. À en juger par votre compilateur de message d'erreur, il a une extension pour permettre int zod1[zo1];
mais pas une extension pour permettre la fourniture de la =0;
.OriginalL'auteur user3102621 | 2014-05-20
Vous devez vous connecter pour publier un commentaire.
Vous pouvez déclarer un
array
seulement avec constante taille, ce qui peut être déduit au moment de la compilation.zo1
,zo2
etzoA
sont variables, et les valeurs qui peut être connu qu'à l'exécution.À élaborer, lorsque vous allouer de la mémoire sur la pile, la taille doit être connue au moment de la compilation. Depuis les tableaux sont locales à la méthode, ils seront placés sur la pile. Vous pouvez soit utiliser une valeur constante, ou d'allouer de la mémoire tas à l'aide de
new
, et de libérer lorsque le fait à l'aide dedelete
, commeMais vous pouvez utiliser
vector
au lieu dearray
ici aussi, etvector
prendra soin de l'allocation sur le tas.Comme une note de côté, vous ne devez pas passer
vector
en valeur, comme l'ensemble du vecteur sera copié et transmis comme argument, et aucun changement ne sera visible qu'à l'appelant côté. Utilisationvector<char>& zodis1
à la place.Ainsi, lorsque l'ensemble du code est compilé que je sache la taille. Il l'habitude de travailler si j'essaie de donner la taille juste avant la partie du code est en cours d'exécution?
vous pouvez, lorsque l'allocation est sur le tas, pas sur la pile.
merci pour la réponse. Sur le vecteur côté, je suppose que ce serait mieux, mais j'ai l'habitude de faire tous les changements pour les vecteurs, donc il n'est pas nécessaire de le faire (sauf que je pense que cela permettrait d'économiser de la mémoire?)
vector<int> zod1(zo1);
est beaucoup plus simple, car il n'y a aucune chance de ne pas supprimer aftewards.OriginalL'auteur Rakib