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 :

problème de case/switch


Sujet :

C

  1. #1
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut problème de case/switch
    Bonjour, voila ma question, pourquoi mon compilateur (mingw) me refuse la déclaration de variables dans un case
    s'il elles ne sont pas encadrées par des accolades?
    Voici le 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
    24
    25
    26
    27
    28
     
    switch (message)
    {
    case WM_PAINT:
    {
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint (hwnd, &ps);
    RECT rect;
    GetClientRect (hwnd, &rect);
    DrawText (hdc,
    "fils graphique",
    -1,
    &rect,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER
    );
    EndPaint (hwnd, &ps);
    return 0;
    }
    case WM_DESTROY:
    PostQuitMessage (0);
    return 0;
     
    case WM_NCLBUTTONDBLCLK:
    Beep (100, 200);
    return 0;
    default:
    return DefWindowProc (hwnd, message, wParam, lParam);
    }
    Dans le case WM_PAINT, si je retire les accolades ça ne compile plus et je n'arrive pas à trouver dans la norme une explication si ce n'est peut être le passage 6.8.3. Donc si quelqu'un pouvait m'éclairer ça serait très sympa.
    Cordialement.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    C'est parce que d'apres la-dite norme, ce qu'il ya apres un "case label" doit être un "statement" (une instruction), et une declaration n'est pas un "statement".
    6.8.1 Labeled statements
    Syntax
    labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement
    ..contrairement aux "compound statements" (blocs d'accolades) qui peuvent contenir des declarations et des statements
    6.8.2 Compound statement
    Syntax
    compound-statement:
    { block-item-listopt }
    block-item-list:
    block-item
    block-item-list block-item
    block-item:
    declaration
    statement

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Merci beaucoup pour cette réponse clair et rapide.

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Cela dit, je comprends pas pourquoi, en C99 (-std=c99), on a le droit de mettre une declaration apres la premiere instruction du case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch (val)
    {
      case VAL_A:
        puts("a");
        break;
      case VAL_B:
        puts("b");
        int k = 9;
        printf("%d\n", k);
        break;
    }

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Gruik: Pour les mêmes raisons qu'en C++, sans doute: Le C99 permet la déclaration de variables en milieu de blocs.
    Par contre, ceci ne devrait pas passer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    switch (val)
    {
      case VAL_A:
        puts("a");
        break;
      case VAL_B:
        puts("b");
        int k = 9;
        printf("%d\n", k);
        break;
      case VAL_C:
        puts("c");
        break;
    }
    Là, tu devrais avoir une erreur "Jump to case VAL_C crosses initialization of k".
    Et tu n'auras plus l'erreur si tu sépares le int k et le k=9...
    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 Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui mais le truc c'est que meme en c99 (avec gcc) on a pas le droit de mettre la declaration dans la premiere instruction du case

Discussions similaires

  1. Problème SELECT, CASE et Group by
    Par Royd938 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 03/10/2014, 07h41
  2. Problème avec un switch/case
    Par Lolitaaa dans le forum Général Java
    Réponses: 2
    Dernier message: 10/12/2009, 22h33
  3. Problème de boucle Switch Case
    Par mLk92 dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2007, 17h20
  4. Problème dans un "switch"
    Par belzeluc dans le forum C++
    Réponses: 4
    Dernier message: 04/06/2006, 12h13
  5. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50

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