Problème de typage de pointeur de pointeur

Problème de typage de pointeur de pointeur - C++ - Programmation

Marsh Posté le 13-02-2005 à 16:20:59    

Salut,
j'ai une courte question :
 
Vous parait-il concevable que ceci soit accepté par un compilateur :

Code :
  1. HElem<View<PosType, ColorType, VortexType>* > *tmp= *(hashViewTable.searchElem(&cur_table_entry));


et pas cela :

Code :
  1. HElem<View<PosType, ColorType, VortexType>* > **tmp= (hashViewTable.searchElem(&cur_table_entry));


 
D'après moi c'est la même chose mais j'ai une erreur :
'tmp' : 'HElem<ValueType> *' differs in levels of indirection from 'HElem<ValueType> ** '
 
Je n'ai volontairement pas mis le contexte car ici ma question repose sur la différence entre ces deux lignes.
 
Comment, étant donné que la première assignation passe, la deuxième puisse elle poser un problème?
 
 :jap:


Message édité par peak le 13-02-2005 à 20:21:18
Reply

Marsh Posté le 13-02-2005 à 16:20:59   

Reply

Marsh Posté le 13-02-2005 à 16:25:41    

y a pas de niveau d'indirection qui tienne, c'est une histoire de typage. vérifie le type de ta rvalue et de ta lvalue

Reply

Marsh Posté le 13-02-2005 à 16:28:44    

Ca m'a l'air d'être le cas classique d'un itérateur qui n'est pas un pointeur et qui n'accepte pas d'être casté en pointeur...
Donc searchElem ne retourne pas un pointeur, mais un objet dont l'opérateur "*" est redéfini.

Reply

Marsh Posté le 13-02-2005 à 20:20:30    

Mais si ma lvalue et rvalue n'étaient pas compatibles la première assignation ne devrait pas marcher, non?
 
Je n'ai pas redéfini d'opérateur non plus.
 
Ce qui m'étonne ici c'est que si j'assigne un pointeur à ce sur quoi pointe un pointeur (ce qui marche) , c'est que c'est un pointeur de pointeur or quand je l'assigne à un pointeur de pointeur ça compile plus.  :??:  
Ca ma juste l'aire très mystérieux....
Je pourrait me satisfaire de la solution1 mais le prob c'est si ma fonction searchElem renvoit NULL  :D  
Donc pour l'instant, je le fait simplement en appelant deux fois de suite searchElem et en testant la première fois si c'est NULL et si ça l'est pas je le reassigne avec la premier solution ; ce qui est pitoyable. :sweat:

Reply

Marsh Posté le 13-02-2005 à 20:42:42    

Peak a écrit :

Mais si ma lvalue et rvalue n'étaient pas compatibles la première assignation ne devrait pas marcher, non?


pas forcément. vérifie

Reply

Marsh Posté le 14-02-2005 à 00:18:58    

Il me semble que c'est correct d'un point de vue des r et l-values mais j'ai changé de technique en remplaçant les pointeurs d'éléments de ma table par des éléments (pointeur->référence). Je pensais pas pouvoir m'en sortir comme ça, mais apparemment ça marche. :)

Code :
  1. HashTable< HElem<View<PosType, ColorType, VortexType>* > > hashViewTable(HASHVIEW_NBR_SLOT);
  2. //HashTable< HElem<View<PosType, ColorType, VortexType>* >* > hashViewTable(HASHVIEW_NBR_SLOT);
  3. HElem<View<PosType, ColorType, VortexType>* >* HElem_ptr= hashViewTable.searchElem(cur_table_entry);


(De plus c'est moins gros en taille mémoire et plus lisible.)
 

Taz a écrit :

pas forcément. vérifie


En fait c'est ça qui m'intrigue; d'après moi c'était justement "forcement".
Comme le premier passe, je pensais pouvoir en déduire que les types étaient compatibles :sweat:, mais apparement mon compilateur pense comme toi.  :ange:  

Reply

Marsh Posté le 14-02-2005 à 09:16:07    

Peak a écrit :

Code :
  1. HElem<View<PosType, ColorType, VortexType>* > *tmp= *(hashViewTable.searchElem(&cur_table_entry));
Code :
  1. HElem<View<PosType, ColorType, VortexType>* > **tmp= (hashViewTable.searchElem(&cur_table_entry));




As-tu essayé de le faire en 2 temps ?

Code :
  1. HElem<View<PosType, ColorType, VortexType>* > *tmp= *(hashViewTable.searchElem(&cur_table_entry));
  2. HElem<View<PosType, ColorType, VortexType>* > **tmp2 = &tmp;


Ca te donneras des indications de ce qui coinçait.

Reply

Marsh Posté le 14-02-2005 à 09:19:55    

vas y rajoute des * jusqu'à que ça marche ...
On te demande de faire une résolution de type à priori, pas un 'ça doit être ça'

Reply

Marsh Posté le 15-02-2005 à 21:53:57    

excusez cette petite latence...
 
C'est vrai que j'avais pas pensé à le couper en deux.
Maintenant le problème c'est que j'arrive plus à générer l'erreur.
Les deux marchent.  :sweat:  
Non je vous jure j'ai pas rêvé.
J'aurai du garder une copie quand ça plantait.
Ca gâche un peu mon poste.
Désolé.
Merci pour vos conseils.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed