9
votes

L'initialisation de la matrice C ++ ne fonctionne pas

J'essaie d'initialiser un tableau de bools comme: xxx

mais quand je le débogé, je ne vois que le premier élément de la matrice initialisée, les autres sont faux. Comment cela peut-il être si? J'utilise QT sur Ubuntu 10 et l'initialisation est effectuée sur un tableau local à l'intérieur d'une méthode.

OK merci pour vos réponses.


0 commentaires

5 Réponses :


-1
votes

Parce que vous avez explicitement initialisé uniquement le premier élément de la matrice, seul le premier élément est initialisé et que les restants ne sont pas.


6 commentaires

Le reste est initialisé à une valeur par défaut de 0. C'est pourquoi il est sûr d'utiliser int i [10] = {0}; à 0-initialiser un tableau.


En fait, tous les éléments sont initialisés. L'État standard indique que tous les éléments restants sont définis sur 0.


@meagar Comment pouvez-vous dire que "int i [10] = {0}" fait autre chose que de régler 0 sur le premier élément.


@yan je suis à peu près sûr qu'il peut dire que parce que c'est ainsi que la langue est définie au travail.


@Tyler Mchenry a l'air d'avoir un peu étrange de dire que la seule fois où vous pouvez initialiser tous les éléments d'un tableau de cette façon, c'est lorsque vous les intentalez à la valeur déjà utilisée par défaut, ce qui a un effet null, mais si vous dites que c'est comment La langue est définie, je vous crois.


Mais @yan, c'est pas déjà utilisé par défaut. Si vous n'aviez donné aucun initialiseur du tout, le tableau serait (généralement) être inaitalisé . La matrice pourrait contenir un mélange de true et false , ainsi que des valeurs qui ne sont pas valides BOOL valeurs du tout. Si vous initialisez n'importe quel des éléments, C ++ fournit un sténographique pour donner des valeurs par défaut aux éléments restants. Ce n'est pas un effet nul. Je pense qu'il y a un mérite de travailler la langue de la façon dont vous (et moi, une fois) pensais, mais il est trop tard pour le changer maintenant. Le code de côté repose déjà sur le comportement actuel.



9
votes

Parce que c'est la façon dont l'initialisation de la matrice fonctionne en C ++. Si vous ne donnez pas explicitement une valeur pour chaque élément, cet élément par défaut à zéro (ou, ici, false) xxx pré>

Notez que P>

 bool FcpNumberIsOk[MAX_FCPS];


2 commentaires

Quand était-ce que la deuxième version est initialisée? Je ne pensais que si vous avez explicitement par défaut - initialiser la classe / structure contenant?


@JDV, si vous définissez la variable comme une durée de stockage statique (statique locale / classe, variables d'espace de noms de noms), il est zéro initialisé au début du programme avant tout ce qui a lieu. Voir Qu'est-ce que le retour principal? .



2
votes

Ceci est le comportement attendu. Le premier élément est initialisé à la valeur spécifiée et le reste est initialisé à la valeur par défaut de 0: xxx


0 commentaires

-1
votes

Utilisation de cette syntaxe, vous n'initialisez que le premier élément (avec la valeur de votre appartement et d'autres d'obtenir par défaut - un [faux]), mais pas d'autres. Vous devez utiliser une matrice et un memset Int ou pour une boucle pour initialiser tous les éléments.


4 commentaires

En fait, tous les éléments sont initialisés. L'État standard indique que tous les éléments restants sont définis sur 0.


Eh bien, je voulais dire ça. Ok, mon erreur.


Memset fonctionnera, la plupart du temps, mais n'est pas portable. :: STD :: Remplir est bien meilleur et fonctionnera sur un tableau bool et sur un bon compilateur, il sera tout aussi efficace.


J'ai eu une mauvaise expérience avec STD :: Copier avec des vecteurs sur MSVC. Donc, pour l'efficacité, j'utilise des fonctions MEMCY et MEMSET. Les sont 100% rapides. Mais oui, je suis toujours vraiment soigné avec eux.



12
votes

Vous avez mal compris. Il semble que vous puissiez que tout élément inhabituel soit initialisé à la même valeur que la dernière valeur explicitement initialisée. La dernière valeur que vous avez mentionnée était true , de sorte que tous les éléments supplémentaires seraient initialisés à vrai . J'ai eu une fois cette même croyance, mais j'ai vite appris autrement.

Ce n'est pas comme ça que ça marche. Tous les éléments inhabituels sont initialisés par défaut, qui pour bool signifie false .

pour définir tous les éléments sur vrai , Essayez quelque chose comme std :: Fill_n : xxx


0 commentaires