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 :

pb avec switch


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut pb avec switch
    Bonjour, j'ai un peu honte de ma question : j'ai un pb avec mon switch. Voici un extrait de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include<stdio.h>
    #include<stdlib.h>
     
    int main()
    {
      const unsigned short Z=2;
      unsigned short z=0,ret;
      switch(z)
      {
        case 0 :
          ret=0;
          break;
        case Z :
          ret=Z;
          break;
        default :
          ret=4;
      }
     
      printf("ret = %u\n",ret);
      return EXIT_SUCCESS;
    }
    et là j'ai un pb car mon Z n'est pas constant (bien que j'ai mis le mot clé const ?). Donc j'ai modifié le code pour qu'il marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include<stdio.h>
    #include<stdlib.h>
     
    #define Z 2
     
    int main()
    {
      unsigned short z=0,ret;
      switch(z)
      {
        case 0 :
          ret=0;
          break;
        case Z :
          ret=Z;
          break;
        default :
          ret=4;
      }
     
      printf("ret = %u\n",ret);
      return EXIT_SUCCESS;
    }
    mais pourquoi est-ce que const unsigned short Z ne marche pas ? N'est-il pas constant ?

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par salseropom
    mais pourquoi est-ce que const unsigned short Z ne marche pas ? N'est-il pas constant ?
    Non parce qu'un programmeur qui se sent motiver à faire des choses atroces pourait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main()
    {
            int a=0;
            const int N=3;
     
            int *p = &N;
     
            (*p)++;
     
            printf("%d\n",N);
            return 0;
    }
    Bien que le compilateur rend :
    tests.c:8: warning: initialization discards qualifiers from pointer target type
    Donc, la seule façon de s'assurer que la valeur ne changera pas est de la mettre en macro...

    Jc

  3. #3
    Membre Expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Par défaut
    c'est une variable constante, et pas une constante... Ce n'est pas la même chose. J'ai bon ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    c'est une variable constante, et pas une constante... Ce n'est pas la même chose. J'ai bon ?
    Quelle est la nuance ?

  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
    Je dis peut-être une bêtise, mais je crois bien que le const employé ainsi marche en C++ (dans le switch)...

    Mais en C, il faut plutôt utiliser #define Z ((unsigned short)2)
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    alors voici mon pb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    const unsigned short Z=f(a,b);
    unsigned short z;
     
    switch(z)
    {
      case 0 :
       blabla; break;
     case Z :
      blabla; break;
    default :
      blabla;
    }
    comment puis-je faire pour que dans ma fonction mon Z soit un #define Z f(a,b) sachant que a et b sont eux-mêmes des résultats intermédiaires ?

  7. #7
    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 salseropom
    comment puis-je faire pour que dans ma fonction mon Z soit un #define Z f(a,b) sachant que a et b sont eux-mêmes des résultats intermédiaires ?
    Tu te compliques la vie inutilement. Chaque valeur de case dans un switch doit etre connu a la compilation. C'est comme ca. Comme ta valeur varie, cela signifie que tu ne peux pas utiliser de switch. Passe a une selection par if else.

  8. #8
    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
    De plus, si tu as beaucoup de valeurs constantes et peu de valeurs variables comme Z, tu peux mettre ta suite de tests dans le default:.
    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.

  9. #9
    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 Médinoc
    Je dis peut-être une bêtise, mais je crois bien que le const employé ainsi marche en C++ (dans le switch)...
    On s'en fout...

  10. #10
    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 Eusebius
    c'est une variable constante, et pas une constante... Ce n'est pas la même chose. J'ai bon ?
    Mais d'où peut bien venir cette confusion entre const et constante ? Comme son nom l'indique, const signifie 'en lecture seule' et non 'constante'.

    Je rephrase :
    c'est une variable à lecture seule, et non une expression constante...

  11. #11
    Membre Expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je rephrase :
    Merci, c'est tellement mieux dit

Discussions similaires

  1. problème avec switch et valeur 0
    Par melisse dans le forum Langage
    Réponses: 12
    Dernier message: 23/02/2007, 13h20
  2. un probleme avec switch
    Par patchouli dans le forum C
    Réponses: 8
    Dernier message: 08/01/2007, 12h39
  3. Erreur de compilation avec SWITCH et CASE
    Par barbarello dans le forum C++
    Réponses: 4
    Dernier message: 21/01/2006, 21h47
  4. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  5. [débutant] Probleme avec switch et héritage
    Par durk dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2005, 09h48

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