IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

basic: const int** != int ** ?


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut basic: const int** != int ** ?
    Pourquoi est-ce impossible d'avoir:
    const int** cpi;
    int** pi;
    cpi=pi;

    mais possible d'avoir:
    const int* cpi;
    int* pi;
    cpi=pi;

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    La norme permet une petite difference de qualification, mais uniquement au premier niveau d'indirection. Donc int * et const int * peuvent etre utilises de facon equivalentes, mais pas int ** et const int ** (i.e. on ne peut pas briser l'equivalence de qualification de facon recursive).
    Il faut donc dire au compilateur que l'on sait ce qu'on fait en forcant le cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cpi = (const int **) pi;

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci mais j'aimerai COMPRENDRE pourquoi? Ou est le probleme pour le compilateur?

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par toto_fr_2002
    Merci mais j'aimerai COMPRENDRE pourquoi? Ou est le probleme pour le compilateur?
    Tu veux comprendre la norme ? Lit le rationale :

    http://www.lysator.liu.se/c/rat/title.html

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Hum... J'ai pas ici les moyens de tester, mais il me semble que ça marche par contre avec un "const int * const *"

  6. #6
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui cela marche avec int * const * car en fait on n'a qu'un niveau et celui la marche (voir le premier message).

    mais cela n'explique pas le pb ....

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai repondu un peu trop vite ....
    const int* const * marche aussi ...

    mais alors, pourquoi pas
    const int**
    ???????

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par toto_fr_2002
    J'ai repondu un peu trop vite ....
    const int* const * marche aussi ...
    Non, cela devrait donner un avertissement egalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main(void)
    {
      int **pi1;
      const int * const *cpi1 = pi1;
      const int **cp2 = pi1;
     
      return 0;
    }
    donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    toto1.c: In function `main':
    toto1.c:4: warning: initialization from incompatible pointer type
    toto1.c:5: warning: initialization from incompatible pointer type
    ce qui est assez normal.

    Il faut comprendre que les compilateurs acceptent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     int* pi;
    const int * cpi = pi;
    pour des raisons de commodites, mais que cela viole la regle qui veut que les qualifiers doivent etre conformes des deux cotes d'une expression (ou lors d'un passage d'argument a une fonction). Le comportement anormal est la, pas ailleurs. Mais il a ete adopte pour eviter des casts lourds et inutiles (notamment pour l'appel de fonctions standards demandant des const char *).

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    1. Vu comme ca cela a un sens.

    2. Quel compilateur utilise tu. Avec intell 8 sur linux et visual 6 le program
    int **pi1;
    const int * const *cpi1 = pi1;
    marche!

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    J'utilise gcc 3.2.2. Note qu'il ne donne que des avertissements. La norme indique que jouer avec des equivalences de types qualifies/non qualifies est un comportement indefini, donc chaque compilateur est libre d'avertir ou non l'utilisateur.

    De toute facon, il convient d'etre prudent lorsqu'un pointeur nonconst est assigne a un pointeur const. Souvent, cela signifie que le programmeur souhaite modifie la lvalue non-modifiable. Il est ainsi preferable de faire un cast explicite, avec un commentaire qui explique l'intention du codeur (ou, mieux, eviter de faire ce genre de choses).

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    DAzumba: C'est l'inverse qui se passe, ici: Conversion de nonconst en const (le truc supposé naturel, quoi)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/03/2014, 21h50
  2. template specialization : const? unsigned? int(*|&)?
    Par ctxnop dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2014, 16h17
  3. [caml light] ( int -> int ) -> int
    Par ylarvor dans le forum Caml
    Réponses: 5
    Dernier message: 26/11/2009, 19h35
  4. erreur sur la fonction LeftStr(const AnsiString ,int )
    Par farid0031 dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/06/2009, 09h27
  5. fread(void*, int, int, FILE*)
    Par keil dans le forum C++
    Réponses: 11
    Dernier message: 25/01/2006, 22h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo