const et pointeur de pointeur

const et pointeur de pointeur - C++ - Programmation

Marsh Posté le 02-01-2007 à 14:56:20    

Bonjour,
 
J'ai ce code :

Code :
  1. int fct(const int **var)
  2. {
  3. }
  4. int main(void)
  5. {
  6. int **a;
  7. fct(a);
  8. }


 
Et à la compilation :
a.cpp: In function 'int main()':
a.cpp:9: error: invalid conversion from 'int**' to 'const int**'
a.cpp:9: error:   initializing argument 1 of 'int fct(const int**)'
 
Pourquoi ai-je cette erreur et comment la corriger ?
 
Merci...

Reply

Marsh Posté le 02-01-2007 à 14:56:20   

Reply

Marsh Posté le 02-01-2007 à 15:06:21    

Code :
  1. const int **a;


 
Ca parait évident, non  :??:

Reply

Marsh Posté le 02-01-2007 à 15:26:29    

karlkox a écrit :

Code :
  1. const int **a;


 
Ca parait évident, non  :??:


 
le fait que ca sorte une erreur n'est pas forcément évident.
La solution réside probablement dans un simple const_cast en faisant attention à ce que la fonction fait de var

Reply

Marsh Posté le 02-01-2007 à 15:38:09    

Mais alors quand je fait ceci pourquoi je n'ait aucune erreur :
 

Code :
  1. int fct(const int *var)
  2. {
  3. }
  4. int main(void)
  5. {
  6. int *a;
  7. fct(a);
  8. }


Reply

Marsh Posté le 02-01-2007 à 15:41:00    

parce que ta fonction peut modifier l'adresse pointée par var et y mettre l'adresse d'un pointeur sur entier constant, auquel cas, il faut que ce qui est au-dessus de l'appel de fonction soit conscient que le pointeur est constant. Dans ton deuxième cas, ce n'est pas le cas, c'est juste un renforcement de la constance de l'expression

Reply

Marsh Posté le 02-01-2007 à 16:29:41    

Ha ok, j'ai donc fait ceci et ça fonctionne, merci :
int fct(const int * const* var)
{  
}

Reply

Marsh Posté le 02-01-2007 à 16:48:32    

euh... je veux pas passer pour un boolay, mais j'ai pas compris pkoi ça compile pas !
 
Enfin, je vois pas pourquoi on peut pas convertir un int** en const int**
 
Normalement la promotion vers const est automatique, c'est le contraire qui est interdit !
Et je vois pas non plus en quoi utiliser < const int * const* var > comme paramètre peut résoudre le pb !
 
Comme ça j'apprendrai un truc aujourd'hui !

Reply

Marsh Posté le 02-01-2007 à 17:25:50    

un exemple vaut mieux qu'un long discours :
 

Code :
  1. const int i = 1234;
  2. void fct(const int **var)
  3. {
  4.   *var = &i; // serait interdit si on avait var du type const int * const *
  5. }
  6. int main()
  7. {
  8.   int a;
  9.   int *p = &a;
  10.   int **pp = &p;
  11.   fct(pp);
  12.   **pp = 456;
  13.   return 0;
  14. }


 
voilà, si cette écriture était permise, alors j'aurais fait un accès en écriture à une constante sans pour autant que le compilateur ne s'en soit plaint, ce qui n'est pas acceptable.
Ainsi, rendre le pointeur lui-même constant lève cette possibilité et rend à nouveau le typage correct (en espérant que ca clarifie les choses)

Reply

Marsh Posté le 02-01-2007 à 17:58:46    

ok j'ai compris, mais j'aurais jamais pensé à ça tout seul. Donc on peut convertir un int** en const int* const* mais pas en const int**
C'est qd même pas très intuitif, mais si en effet c'est correct :jap:

Reply

Marsh Posté le 03-01-2007 à 00:48:16    

Si tu as l'occasion de lire le psaume §4.4.4 (condition 3), tu auras une idée du pourquoi c'est si peu intuitif :)

Reply

Marsh Posté le 03-01-2007 à 00:48:16   

Reply

Marsh Posté le 03-01-2007 à 00:54:49    

++fab a écrit :

Si tu as l'occasion de lire le psaume §4.4.4 (condition 3), tu auras une idée du pourquoi c'est si peu intuitif :)


 
j'ai eu le réflexe d'aller fouiner dans le K&R mais §4 rien a voir.
 

Reply

Marsh Posté le 03-01-2007 à 01:01:46    

-ThX- a écrit :

j'ai eu le réflexe d'aller fouiner dans le K&R mais §4 rien a voir.


§4.4.4 du standard C++.

Reply

Marsh Posté le 03-01-2007 à 11:34:42    

++fab a écrit :

§4.4.4 du standard C++.


c'est pas le chapitre 4.4.4 du Stroustrup non plus, je n'ai que ça, j'ai pas la norme :(

Reply

Marsh Posté le 03-01-2007 à 23:31:41    

jesus_christ a écrit :

c'est pas le chapitre 4.4.4 du Stroustrup non plus, je n'ai que ça, j'ai pas la norme :(


m'enfin, c'est pourtant le livre saint de la religion C++ [:spamafote]  

Spoiler :

Je n'ai qu'une version papier, et j'ai un peu de mal à me motiver à recopier l'extrait en question  [:petrus75]


Reply

Sujets relatifs:

Leave a Replay

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