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 :

une histoire de switch imbriqués


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut une histoire de switch imbriqués
    bonjour à tous

    petit souci avec mes switchs imbriqués :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    UINT iId=LOWORD(wParam);
    (...)
    switch(iId)
        {	
            case ID_PUSHBUTTON_1:
    		    {
    		    bitrate=GetDlgItemInt(fenetrePrincipale, (HMENU)ID_EDITBOX_1, NULL, FALSE);
    			if (bitrate==' ')
    			   bitrate=0;
    			MessageBox(fenetrePrincipale,lpMessage,"gou",MB_OK);
    			}
    		    break;		
     
            case ID_PUSHBUTTON_3:
                DestroyWindow(fenetrePrincipale);
                break;		
    		case ID_RADIOBUTTON_11:
    		    fps=25;			
    		    break;
    		case ID_RADIOBUTTON_12:
    		    fps=29.976;			
    		    break;
    		case ID_RADIOBUTTON_13:
    		    {
    		    switch(iId)
                {
    		    case ID_PUSHBUTTON_2:
    		    {
    			MessageBox(fenetrePrincipale,lpMessage,"gou",MB_OK);
                freefps=GetDlgItemText(fenetrePrincipale, (HMENU)ID_EDITBOX_2, NULL, 6);
    			fps=freefps;
    			}
                break;			
    			}
    			}
    		    break;
            case ID_CHECKBOX_1:        
                AfficheActionCheckBox(iId-ID_CHECKBOX_1,hCtl,fenetrePrincipale);			
                break;		
        }	
    }
    ici je zoom sur le case ID_RADIOBUTTON_13 : quand je clique sur le PUSHBUTTON_2 : aucun message affiché

    dans ma logique : il n'affiche la messagebox que si je clique sur RADIOBUTTON_13 et pas dans les autres cas

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Les deux switch imbriqué portent sur la même variable iId.

    Comme ID_RADIOBUTTON_13 et ID_PUSHBUTTON_2 sont différents, on ne peut jamais entrer dans la case ID_PUSHBUTTON_2.

    EDIT :

    tu peux ajouter un booléen statique pour résoudre ton problème :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     static int mon_booleen = 0;
        UINT iId = LOWORD(wParam);
        switch (iId) {
        case ID_PUSHBUTTON_1:
            {
                bitrate =
                    GetDlgItemInt(fenetrePrincipale, (HMENU) ID_EDITBOX_1,
                                  NULL, FALSE);
                if (bitrate == ' ')
                    bitrate = 0;
                MessageBox(fenetrePrincipale, lpMessage, "gou", MB_OK);
            }
            break;
        case ID_PUSHBUTTON_2:
            if (mon_booleen == 1) {
                MessageBox(fenetrePrincipale, lpMessage, "gou", MB_OK);
                freefps =
                    GetDlgItemText(fenetrePrincipale, (HMENU) ID_EDITBOX_2,
                                   NULL, 6);
                fps = freefps;
            }
            break;
        case ID_PUSHBUTTON_3:
            DestroyWindow(fenetrePrincipale);
            break;
        case ID_RADIOBUTTON_11:
            mon_booleen = 0;
            fps = 25;
            break;
        case ID_RADIOBUTTON_12:
            mon_booleen = 0;
            fps = 29.976;
            break;
        case ID_RADIOBUTTON_13:
            mon_booleen = 1;
            break;
        case ID_CHECKBOX_1:
            AfficheActionCheckBox(iId - ID_CHECKBOX_1, hCtl,
                                  fenetrePrincipale);
            break;
        }

  3. #3
    Invité
    Invité(e)
    Par défaut
    ok merci à vous pour le tuyau

    bonne journée

  4. #4
    Invité
    Invité(e)
    Par défaut
    bonjour

    je n'ai jamais utilisé static int

    pouvez-vous m'expliquer à quoi cela sert ?

    et j'ai essayé le code que vous avez proposé : il compile bien sans souci

    le souci vient après : quand j'exécute l'appli il affiche : l'exe a rencontré un problème et doit fermer

  5. #5
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    C'est juste pour répondre à ton interrogation quand au mot clé static:

    Ce mot clé permet de déclarer une variable qui se comportera comme une variable globale (qui sera donc initialisée qu'une seule fois) mais dont la portée est limitée au scope courant.

    Exemple:

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int foo()
    {
    	static int i = 0;
    	return i++;
    }
     
    int main()
    {
    	unsigned int i;
    	for( i = 0; i < 10; ++i )
    	{
    		printf("%i\n", foo() );
    	}
    	return 0;
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    pardon mais je n'ai pas bien compris votre explication

    de plus, qu'est-ce le "scope courant" ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    bon, alors j'ai remplacé le code par celui-ci :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    int mon_booleen;
    (...)
    switch(iId)
        {	
            case ID_PUSHBUTTON_1:
    		    {
    		    bitrate=GetDlgItemInt(fenetrePrincipale, (HMENU)ID_EDITBOX_1, NULL, FALSE);
    			if (bitrate==' ')
    			   bitrate=0;			
    			}
    		    break;
     
    		case ID_PUSHBUTTON_2:
    		    if (mon_booleen == 1) 
    			{			
                freefps=GetDlgItemText(fenetrePrincipale, (HMENU)ID_EDITBOX_2, NULL, 6);			
    			fps=strtod(freefps, NULL);
    			}
                break;
     
            case ID_PUSHBUTTON_3:
                DestroyWindow(fenetrePrincipale);
                break;
     
    		case ID_RADIOBUTTON_11:
    		    mon_booleen=0;
    		    fps=25;			
    		    break;
     
    		case ID_RADIOBUTTON_12:
    		    mon_booleen=0;
    		    fps=29.976;			
    		    break;
     
    		case ID_RADIOBUTTON_13:		    		    
    		    mon_booleen=1;						
    		    break;
     
            case ID_CHECKBOX_1:        
                AfficheActionCheckBox(iId-ID_CHECKBOX_1,hCtl,fenetrePrincipale);			
                break;		
        }
    ici j'ai cherché à simplifier au maximum : j'ai enlevé le static

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Pour repondre a l'utilisation de static.

    Le "scope courant" de JulienDuSud est en realite la porté d'un bloc.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Debut d'un bloc 1 (qui se trouve etre une fonction)
    int main()
    {
        ...
        if (...)// Debut d'un autre bloc, le bloc 2
        {
     
        }// Fin du bloc 2
     
    }// fin bloc 1
    Lorsqu'une variable est declarer dans un bloc, elle nait dans ce bloc et meurt a la fin de celui ci.

    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
     
    //Debut d'un bloc 1 (qui se trouve etre une fonction)
    int main()
    {
        ...
        if (...)// Debut d'un autre bloc, le bloc 2
        {
             int exemple = 0;//declaration d'une variable de type int.
     
        }// Fin du bloc 2, la variable exemple meurt.
     
        // Puisque la variable est 'morte', elle est inutilisable ici
        // exemple = 4; provoquerai une erreur.
     
    }// fin bloc 1

    Maintenant, interessons nous au mot cle static.
    Prenons cette exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void afficherExemple (void)
    {
        int exemple = 0;
        printf ("%d \n",exemple);
        exemple++;
    }
     
    int main()
    {
        afficherExemple ();
        afficherExemple ();
    }

    Ce code produira le resultat suivant :

    0
    0

    En effet, la variable 'exemple' nait dans la fonction et meurt a la fin de celle ci. Lorsque l'on appele une deuxieme fois la fonction Afficher, une nouvelle variable nait et meurt a la fin de la fonction.

    Le mot cle static va empecher cette 'mort' en retenant en memoire la valeur de exemple.
    Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void afficherExemple (void)
    {
        static int exemple = 0;
        printf ("%d \n",exemple);
        exemple++;
    }
     
    int main()
    {
        afficherExemple ();
        afficherExemple ();
    }
    Ce code produira le resultat suivant :

    0
    1

    Voila, si je me suis trompé ou si tu n'as pas tout compris, dite le moi !

    Bonne Soirée

  9. #9
    Invité
    Invité(e)
    Par défaut
    mon dernier code est-il bon ?

    je le pense : en effet si une variable est déclarée à l'intérieur d'une fonction elle y meurt à la fin

    ici vu que l'int mon_booleen n'est déclaré et utilisé qu'à l'intérieur de la fonction, alors c'est bon n'est-ce pas ?

    en tout cas je n'ai plus le message d'erruer windows qui apparaît

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    je le pense : en effet si une variable est déclarée à l'intérieur d'une fonction elle y meurt à la fin
    Sauf justement si la variable est déclarée static : elle survit (et conserve sa valeur) en sortie de la fonction.
    La première fois que la fonction est appelée, la variable a pour valeur, à l'entrée dans la fonction, sa valeur d'initialisation (ou 0, NULL,... selon son type si elle n'est pas explicitement initialisée). Les fois suivantes, cette valeur est celle qu'elle avait à la sortie de l'appel précédent.

    Par contre, elle n'est pas accessible en dehors de la fonction parce que son identificateur est inconnu ailleurs
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Invité
    Invité(e)
    Par défaut
    donc ici mon code fonctionne car il n'est utilisé qu'à l'intérieur de la fonction

    @Mabu : merci pour le code que vous m'avez donné il fallait y penser : c'est vraiment fou ce que l'on peut faire avec la progra

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

Discussions similaires

  1. encore une histoire de select imbriqués
    Par Dendrite dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2010, 16h09
  2. Une histoire de compte à rebours (avec formulaire)
    Par Olivier14 dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 04/03/2009, 13h43
  3. créer une fonction avec "si" imbriqués
    Par JUMJJUMJ dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 22h03
  4. Une histoire de lien...
    Par sloshy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/08/2005, 23h13
  5. [JAR][debutant] encore une histoire de classpath
    Par blaz dans le forum Général Java
    Réponses: 6
    Dernier message: 27/07/2005, 12h28

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