Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1204 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Initialisation d'un vector

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Initialisation d'un vector

n°884084
meerthyl
Posté le 27-10-2004 à 16:41:33  profilanswer
 

Bonjour,
 
Je cherche à comprendre pourquoi est-ce que mon compilateur (GCC sous Windows en utilisant MinGW) m'insulte lorsque je fais ceci :
 

Code :
  1. #include <vector>
  2. int main()
  3. {
  4.     std::vector<int*> v(10, NULL);
  5.     return 0;
  6. }


 
Alors que si j'utilise un vector<int> ça passe (valable pour tout autre objet).
 
Bref, est-il possible de créer un vecteur de pointeurs nuls ?

mood
Publicité
Posté le 27-10-2004 à 16:41:33  profilanswer
 

n°884090
Lam's
Profil: bas.
Posté le 27-10-2004 à 16:47:38  profilanswer
 

Oui.

Code :
  1. #include <vector>
  2. int main()
  3. {
  4.      int * empty = 0;
  5.      std::vector<int*> v(10, empty);
  6.      return 0;
  7. }


Le constructeur a besoin d'une référence en 2ème paramètre.
 
edit: ou bien simplement:

Code :
  1. std::vector<int*> v(10, (int *)0);


 
Je me souvenais plus que la construction de références vers des objets temporaires s'était améliorée dans g++...


Message édité par Lam's le 27-10-2004 à 16:54:12
n°884105
Taz
bisounours-codeur
Posté le 27-10-2004 à 16:56:28  profilanswer
 

avec un static_cast c'est encore plus joli :p

n°884113
Taz
bisounours-codeur
Posté le 27-10-2004 à 17:01:11  profilanswer
 

je vois pas le machin avec les références. c'est juste qu'il y a une ambiguité
 
std::vector<int*> v(10, static_cast<int*>(0))
 
et tout roule

n°884120
meerthyl
Posté le 27-10-2004 à 17:05:09  profilanswer
 

Merci beaucoup. :)
 
Je ne connaissais pas les static_cast<>, je vais chercher de la doc là-dessus.

n°884128
Taz
bisounours-codeur
Posté le 27-10-2004 à 17:08:00  profilanswer
 

en règle général, n'utilise JAMAIS les cast C (T*) en C++

n°884142
HelloWorld
Salut tout le monde!
Posté le 27-10-2004 à 17:17:42  profilanswer
 

Comment cela se fesse que static_cast passe pour (et que pour d'ailleurs) un pointeur nul ? C'est pas du domaine de reinterpret_cast plutôt ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°884153
Taz
bisounours-codeur
Posté le 27-10-2004 à 17:23:30  profilanswer
 

non.
0 c'est le pointeur nul... selon le contexte. Si tu file 0 comme ça, le template il perd un peu les pédales. Donc on explicite le contexte.

n°884157
Lam's
Profil: bas.
Posté le 27-10-2004 à 17:25:34  profilanswer
 

HelloWorld a écrit :

C'est pas du domaine de reinterpret_cast plutôt ?


Nope.  
 
Un reinterpret_cast ça serait plutôt passer de float* à int*. Mais convertir le pointeur 0 en int *, ça passe, vu qu'il n'a pas de type.
 
 
Pis j'ai pas mis de static_cast parce que j'avais la flemme, et que dans ce genre de cas là, j'en met rarement (pour convertir des valeurs, passer des trucs aux APIs C, etc. c'est juste un moyen mnémotechnique pour repérer facilement dans mon code ce qui est propre et ce qui est de la bidouille).

n°884162
HelloWorld
Salut tout le monde!
Posté le 27-10-2004 à 17:28:02  profilanswer
 

Oui ca je sais. Ce que je pige pas c'est pourquoi on explicite avec static_cast dans le cas de 0, et reinterpret_cast sinon. Ma question se résume à pourquoi ça :

Code :
  1. int * a = static_cast<int*>( 0 ); // ok
  2.     int * c = reinterpret_cast<int*>( 1 ); // ok
  3.     int * b = static_cast<int*>( 1 ); // dtc !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 27-10-2004 à 17:28:02  profilanswer
 

n°884170
Lam's
Profil: bas.
Posté le 27-10-2004 à 17:31:28  profilanswer
 

Taz a écrit :

je vois pas le machin avec les références. c'est juste qu'il y a une ambiguité


 
T'es trop jeune, c'est pour ça. :)  
 
Dans les vieilles versions (3.0 ou 2.9X, je sais plus), g++ ne savait pas construire de références constantes vers des objets temporaires.  
 
Donc ça, ça merdait un peu:
 

Code :
  1. struct World { int x; };
  2. void Hello(const World & t) {
  3.   std::cout << t.x << std::endl;
  4. }
  5. int main() {
  6.   Hello(World(4));
  7. }


Message édité par Lam's le 27-10-2004 à 17:33:10
n°884173
Lam's
Profil: bas.
Posté le 27-10-2004 à 17:32:33  profilanswer
 

HelloWorld a écrit :

Oui ca je sais.  


 
Pardon. C'est parce que 0 est une valeur spéciale, qui correspond au pointeur Null (ou Nil en Pascal, ou NULL en C). Alors que 1, c'est l'adresse 1.

n°884195
Taz
bisounours-codeur
Posté le 27-10-2004 à 17:57:47  profilanswer
 

peut être mais là ça n'est pas le problème. Cette ambiguité n'a rien à voir avec une implémentation particulière. et de ce que tu racontes, je n'ai jamais vu ce problème avec ces versions de gcc. Ce que tu dis n'a pas de sens.

n°884307
HelloWorld
Salut tout le monde!
Posté le 27-10-2004 à 19:43:03  profilanswer
 

Lam's a écrit :

Pardon. C'est parce que 0 est une valeur spéciale, qui correspond au pointeur Null (ou Nil en Pascal, ou NULL en C). Alors que 1, c'est l'adresse 1.


NULL en C, Nil en Pascal, mais Nul en français ;)
Donc c'est une exception de la norme.
J'avais suivi un débat sur le C sur "NULL vaut-il toujours 0 ?". C'était complexe, je crois me souvenir que le pointeur NULL peut valoir autre chose que zéro, mais le compilo doit faire en sorte que c'est comme si c'était 0.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°884311
Taz
bisounours-codeur
Posté le 27-10-2004 à 19:45:51  profilanswer
 

NULL c'est 0. En C et C++. En C on rajoute un ((void*)0) pour quoi le compilo ferme un peu sa gueule. En C et C++, 0 représente le pointeur nul. ce qui ne signifie pas que la représentation binaire du pointeur nul doit être 0.

n°884374
HelloWorld
Salut tout le monde!
Posté le 27-10-2004 à 20:52:42  profilanswer
 

Ok thx a vous deux.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Initialisation d'un vector

 

Sujets relatifs
Initialisation d'un char*, malloc ou pas ?[c++] Conversion vector<T> en T*
Problème avec la classe vectorProbleme vector
[php] initialisation d un array ?Pointeur sur un élément d'un std::vector
JTABLE(vector,vector)Initialisation des labels à partir d'un fichier excel
initialisation et réception d'informations pas usb[C++] std::vector initialisation / constantes
Plus de sujets relatifs à : Initialisation d'un vector


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR