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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Par défaut
    Merci mais j'aimerai COMPRENDRE pourquoi? Ou est le probleme pour le compilateur?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 *"
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    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
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Par défaut
    J'ai repondu un peu trop vite ....
    const int* const * marche aussi ...

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

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    DAzumba: C'est l'inverse qui se passe, ici: Conversion de nonconst en const (le truc supposé naturel, quoi)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ 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