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

  FORUM HardWare.fr
  Programmation
  C++

  const et pointeur de pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

const et pointeur de pointeur

n°1497962
vincent0
Posté le 02-01-2007 à 14:56:20  profilanswer
 

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...

mood
Publicité
Posté le 02-01-2007 à 14:56:20  profilanswer
 

n°1497965
karlkox
Posté le 02-01-2007 à 15:06:21  profilanswer
 

Code :
  1. const int **a;


 
Ca parait évident, non  :??:

n°1497975
theshockwa​ve
I work at a firm named Koslow
Posté le 02-01-2007 à 15:26:29  profilanswer
 

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

n°1497985
vincent0
Posté le 02-01-2007 à 15:38:09  profilanswer
 

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. }


n°1497987
theshockwa​ve
I work at a firm named Koslow
Posté le 02-01-2007 à 15:41:00  profilanswer
 

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

n°1498007
vincent0
Posté le 02-01-2007 à 16:29:41  profilanswer
 

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

n°1498016
jesus_chri​st
votre nouveau dieu
Posté le 02-01-2007 à 16:48:32  profilanswer
 

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 !

n°1498022
theshockwa​ve
I work at a firm named Koslow
Posté le 02-01-2007 à 17:25:50  profilanswer
 

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)

n°1498033
jesus_chri​st
votre nouveau dieu
Posté le 02-01-2007 à 17:58:46  profilanswer
 

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:

n°1498077
++fab
victime du syndrome IH
Posté le 03-01-2007 à 00:48:16  profilanswer
 

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 :)

mood
Publicité
Posté le 03-01-2007 à 00:48:16  profilanswer
 

n°1498079
-ThX-
Not here anymore
Posté le 03-01-2007 à 00:54:49  profilanswer
 

++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.
 

n°1498080
++fab
victime du syndrome IH
Posté le 03-01-2007 à 01:01:46  profilanswer
 

-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++.

n°1498167
jesus_chri​st
votre nouveau dieu
Posté le 03-01-2007 à 11:34:42  profilanswer
 

++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 :(

n°1498517
++fab
victime du syndrome IH
Posté le 03-01-2007 à 23:31:41  profilanswer
 

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]



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

  const et pointeur de pointeur

 

Sujets relatifs
Pointeur vers un tableau multi dimensionnel de taille variableconst ou "pas const"
Map et pointeur sur fonction[C] Comprehension d'un pointeur en C
const devant une fonction[resolu] Valeur de pointeur en assembleur
pointeur sur vecteur de double[C++] caster un pointeur en int ?
problème avec une fonction qui renvoie un pointeur de char 
Plus de sujets relatifs à : const et pointeur de pointeur


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