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

  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 : 45
    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 398
    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 398
    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 398
    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 398
    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
    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
    En effet, je pense que le mieux est alors de faire une succession de if then else. Ca risque d'être un peu cochon, mais tant pis.
    Merci de vos explications.

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

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

  13. #13
    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 salseropom
    En effet, je pense que le mieux est alors de faire une succession de if then else. Ca risque d'être un peu cochon, mais tant pis.
    Mais non. Donne des specifications claires et tu écriras du code clair.

    Quelles sont le valeurs possibles de z ?
    Quelles sont le valeurs autorisées de z ?
    Quelles sont le valeurs de z qui ont un sens bien défini ?

    Ensuite, ça résout à coup d'enum, et de switch-case-default.

    Il faut cesser de coder comme un goret, et commencer à réfléchir avant de coder...

  14. #14
    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
    Je vais précisez mon prgm : Z >= 2 est une constante qui est défine par l'utilisateur (que je lis avec un fgets). Donc elle est fixée une bonne fois pour toute au tout début du prgm (Z correspond au nombre de zones que j'ai).
    z est une variable qui boucle sur les zones. Donc z=0...Z-1
    J'étudie l'échange de masse entre deux zones, donc la zone 0 n'échange de la masse qu'avec la zone 1, la zone Z-1 n'échange de la masse qu'avec la zone Z-2 et la zone z (z=1..Z-2) échange de la masse avec la zone z-1 et z+1, d'où mon switch case default
    Pb assez simple, résolut avec des if then else mais que j'aimerais résoudre avec des switch case default pour une meilleur lecture du code.

  15. #15
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Sauf si l'échange est différent entre la zone 0 et la zone 1 de l'échange entre la zone n et la zone n+1 et par analogie avec la zone Z, tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(z > 0)
      {
       /* Faire l'échange avec la zone z-1 */
      }
     
    if(z<Z)  /* ou <= dépendant de ta spec */
      {
        /* Faire l'échange avec la zone z+1 */
      }
    Jc

  16. #16
    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
    Salut fearyourself, effectivement, ton algo est un peu plus simple ! Merci.

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