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 :

mon_booleen ne fonctionne pas


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut mon_booleen ne fonctionne pas
    Bonjour,

    j'avais commencé un sujet : c'est au sujet des switch...case : comme je n'ai pas retrouvé le sujet j'en ai donc posté un nouveau.

    Voici :
    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
    switch(iId)
        {	
            case ID_PUSHBUTTON_1:		    
    		    bitrate=GetDlgItemInt(fenetrePrincipale, ID_EDITBOX_1, NULL, FALSE);			
    		    break;
     
    		case ID_PUSHBUTTON_2:			
    		    // if (mon_booleen == 1)
    			{			
                freefps=GetDlgItemText(fenetrePrincipale, ID_EDITBOX_2, buf, 7);
    			fps=strtod(buf, NULL);
    			sprintf(lpMessage,"%.3f",fps);
    			MessageBox(fenetrePrincipale,lpMessage,"",MB_OK);
    			}			
                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=23.9765;			
    		    break;
     
    		case ID_RADIOBUTTON_13:		    		    
    		    mon_booleen=1;						
    		    break;
     
            case ID_CHECKBOX_1:        
                AfficheActionCheckBox(iId-ID_CHECKBOX_1,hCtl,fenetrePrincipale);			
                break;		
        }	
    }
    j'avais donc créer les bouton : ce que je voulais faire c'est ne stocker la valeur (getdlgitemtext) que si on coche le 3ème radiobutton

    à l'époque on m'avait dit d'introduire un 'booléen' : de le mettre à '1' si radiobutton 3 coché, à 0 sinon

    or le code ne fonctionne pas

    j'ai eu beau cherché je n'ai pas trouvé ce qui clochait

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Comment est déclaré mon_boolean, et où?
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    oui très juste il n'était déclaré que dans la fonction où se trouvaient les switch...case

    je l'ai déclaré en variable globale et ça marche

    mais pourtant le 'int mon_booleen' n'est pas utilisé en dehors de la fonction

    à moins que Windows l'utilise je ne sais pas

  4. #4
    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
    A la fin de la fonction des switch case, ton booleen meurt.
    Par consequent, a chaque fois que tu appele la fonction avec les switch case, ton booleen "revit" et se reinitialise". Si tu veux garder son existence, alors il faut le definir dans la fonction appelante et le passer en parametre.

    C'est ce que tu as fait de facon brutal avec ta variable global. (que tu te depechera de modifier pour l'enlever)

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    N'oublie pas que la fonction est appelée plusieurs fois, alors que ses variables locales sont temporaires.
    Généralement, on passe par une structure et on utilise SetWindowLongPtr() et GetWindowLongPtr() pour stocker un pointeur vers cette structure.

    @SoftEvans: On n'a pas de contrôle sur le prototype de cette fonction, c'est une fonction callback...
    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 é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
    Je ne savais pas.
    Comment l'as tu su ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je le savais parce qu'il a posé des questions avant dans la partie Windows du forum.

    Sinon, ici rien ne l'indiquait formellement. La présence de fonctions Windows et le switch-case sur des IDs auraient pu mettre la puce à l'oreille, mais vu qu'on ne voit même pas ici les case sur les messages Windows... (ce code est celui du case WM_COMMAND)
    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.

  8. #8
    Invité
    Invité(e)
    Par défaut
    salut à tous

    je vais être embêtant de bon matin (prenez le ptit déj' avant de lire mon message )

    je voudrais reprendre ce que tu as dis softevans : une variable appelée à l'intérieur d'une fonction ne prend vie qu'à l'intérieur et meurt à la fin

    dans ce cas (selon ma logique) rien ne sert de la déclarer autre part qu'à l'intérieur de la fonction puisqu'elle n'est utile que dedans

    ici la fonction est appelée lors du WM_COMMAND : si on regarde le code alors à chaque fois que je clique sur le radiobutton 1 ça met mon_booleen à 0, pareil pour le radiobutton 2, et pour le n°3 ça met mon_booleen à 1

    bref à chaque fois que je clique sur un radiobutton ça reinitialise mon_booleen

    désolé mais je ne saisi pas très bien alors que c'est pourtant la base de tout langage de programmation

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    dans ce cas (selon ma logique) rien ne sert de la déclarer autre part qu'à l'intérieur de la fonction puisqu'elle n'est utile que dedans
    Mais dans ce cas tu te retrouves obligé à la déclarer locale static.
    Et ma logique, c'est qu'une variable locale static n'est qu'une variable globale déguisée. J'ai déjà vu les conséquences néfastes de déclarer une variable static dans une WindowProc; la déclarer globale à la place ne supprime pas ces conséquences, mais attire l'attention du programmeur dessus: C'est un signal "attention, c'est une variable globale, donc ça ne marche que sur une seule fenêtre de ce type à la fois". Un signe que les choses ne sont pas faites proprement.

    Si tu veux faire les choses proprement, réfère-toi à ce message.
    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.

  10. #10
    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
    Citation Envoyé par gizmo27 Voir le message

    je voudrais reprendre ce que tu as dis softevans : une variable appelée à l'intérieur d'une fonction ne prend vie qu'à l'intérieur et meurt à la fin

    dans ce cas (selon ma logique) rien ne sert de la déclarer autre part qu'à l'intérieur de la fonction puisqu'elle n'est utile que dedans

    ici la fonction est appelée lors du WM_COMMAND : si on regarde le code alors à chaque fois que je clique sur le radiobutton 1 ça met mon_booleen à 0, pareil pour le radiobutton 2, et pour le n°3 ça met mon_booleen à 1

    bref à chaque fois que je clique sur un radiobutton ça reinitialise mon_booleen
    Avec le peu de code que l'on a, c'est impossible a dire si le booleen va etre effectif.

    Imaginons ceci :




    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
    44
    45
    46
     
    int TaFonction (/* des parametre */)
    {
        int mon_booleen = 0;
        /* d'autre variable */
     
        switch(iId)
        {	
            case ID_PUSHBUTTON_1:		    
                bitrate=GetDlgItemInt(fenetrePrincipale, ID_EDITBOX_1, NULL, FALSE);			
                break;
     
            case ID_PUSHBUTTON_2:			
                if (mon_booleen == 1)
    	    	{			
                    freefps=GetDlgItemText(fenetrePrincipale, ID_EDITBOX_2, buf, 7);
                    fps=strtod(buf, NULL);
                    sprintf(lpMessage,"%.3f",fps);
                    MessageBox(fenetrePrincipale,lpMessage,"",MB_OK);
                }			
                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=23.9765;			
    		    break;
     
    		case ID_RADIOBUTTON_13:		    		    
    		    mon_booleen=1;						
    		    break;
     
            case ID_CHECKBOX_1:        
                AfficheActionCheckBox(iId-ID_CHECKBOX_1,hCtl,fenetrePrincipale);			
                break;		
        }
     
    }
    Si tu as ce type de code, mon_booleen ne sert a rien ! On ne fait qu'un passage dans le switch.
    Lors de l'appel de fonction, la variable mon_booleen prend 0 par default (je suppose que c'est le cas chez toi), puis peut prendre 1 dans le switch, puis on arrive a la fin et destruction de la variable locale mon_booleen.
    Lorsqu'on rapelle TaFonction, le booleen renait mais a 0, et le cycle se repete.


    Si tu as ce schema dans ton code, je te conseille de le changer (passer mon_booleen par argument serait une bonne solution, mais il y a peut etre mieux).

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour moi, le plus simple serait de récupérer directement l'état du bouton radio, plutôt que de passer par une variable.
    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.

  12. #12
    Invité
    Invité(e)
    Par défaut
    ah ok tu veux sûrement dire par là que si mon_booleen=1 à l'intérieur d'un case, la valeur se perd à l'instruction break grosso modo ?
    Dernière modification par Invité ; 03/11/2009 à 12h10.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Un signe que les choses ne sont pas faites proprement.
    Si tu veux faire les choses proprement, réfère-toi à ce message.
    Les pointeurs ça n'est pas que je ne les aime pas mais ils me font peur

    j'ai eu beau lire 50000 tutos 50000 explications différentes et jamais je n'ai compris concrètement ce que ça voulait dire

    j'ai seulement compris que ça mettait un truc dans la RAM

    je n'ai jamais compris la différence entre pointeurs et variable/tableau

    d'un autre côté je me dis que ce projet serait pour moi l'occasion d'assimiler définitivement cette notion une fois pour toute

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    Les pointeurs ça n'est pas que je ne les aime pas mais ils me font peur

    j'ai eu beau lire 50000 tutos 50000 explications différentes et jamais je n'ai compris concrètement ce que ça voulait dire

    j'ai seulement compris que ça mettait un truc dans la RAM

    je n'ai jamais compris la différence entre pointeurs et variable

    d'un autre côté je me dis que ce projet serait pour moi l'occasion d'assimiler définitivement cette notion une fois pour toute
    Oui, t'as intéret. Déjà, un pointeur est une variable. Et (nonobstant le concept de registres), toute variable est quelque part dans la mémoire. Le pointeur est juste une variable qui dit où.

    Le plus simple, c'est la base, la fonction d'échange. Avec des paramètres simples, ça marche pas:
    Code C : 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
    #include <stdio.h>
     
    void Echange(int gauche, int droite)
    {
    	int temporaire = gauche;
    	gauche = droite;
    	droite = temporaire;
    }
     
    int main(void)
    {
    	int a = 1;
    	int b = 42;
     
    	printf("Avant : a=%d, b=%d\n", a, b);
    	Echange(a, b);
    	printf("Apres : a=%d, b=%d\n", a, b);
    	return 0;
    }
    Et avec des pointeurs, ça marche mieux:
    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
    #include <stdio.h>
     
    void Echange(int *pGauche, int *pDroite)
    {
    	/*Note que le temporaire lui-même n'est pas un pointeur.
    	  C'est un int, vu qu'on échange les int pointés.*/
    	int temporaire = *pGauche;
    	*pGauche = *pDroite;
    	*pDroite = temporaire;
    }
     
    int main(void)
    {
    	int a = 1;
    	int b = 42;
    	int *pa;
    	int *pb;
     
    	pa = &a; /*On initialise pa avec l'adresse de a.
    	           pa pointe maintenant sur a.*/
    	pb = &b; /*On initialise pb avec l'adresse de b.
    	           pb pointe maintenant sur b.*/
     
    	/*Note: la norme exige de caster un pointeur en void* avant de le passer à printf.
    	  C'est à cause de certaines machines où les pointeurs n'ont pas tous la même taille.*/
    	printf("Avant : a=%d, b=%d, pa=%p, pb=%p\n", a, b, (void*)pa, (void*)pb);
    	Echange(pa, pb);
    	printf("Après : a=%d, b=%d, pa=%p, pb=%p\n", a, b, (void*)pa, (void*)pb);
    	return 0;
    }
    Je posterai bientôt des explications plus complètes.
    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.

  15. #15
    Invité
    Invité(e)
    Par défaut
    en vérité je dirai que le plus dur c'est de savoir quand utiliser les variables et quand utiliser les pointeurs

    merci pour votre aide

  16. #16
    Invité
    Invité(e)
    Par défaut
    en vérité pour échanger 2 nombres il suffit d'introduire une variable supplémentaire, ce que vous avez presque fait avec 'temporaire'

    il aurait fallu écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    temporaire=gauche;
    gauche=droite;
    droite=temporaire;
    après je me doute que vous avez fait ça volontairement pour l'exemple

    mais là où je ne suit pas c'est que ça fonctionne très bien dans les 2 cas : que la variable soit à un endroit ou à un autre dans la RAM, cela diffère en quoi ?

    à part faire moins ramer le programme c'est tout ce que je vois pour l'instant

    après je crois comprendre que vous voulez me dire que de stocker mes valeurs dans la RAM permet qu'elles ne se perdent pas

    ce que j'ai du mal à cerner c'est pour quelle raison ne pas utiliser une variable bête et méchante ?

    en quoi n'est-ce pas propre d'utiliser une variable globale et pourquoi est-ce disons "mal vu" ?
    car en définitive c'est une solution pour ne pas perdre la valeur non ?

    après je ne dis pas que j'ai raison mais je cherche juste à comprendre c'est tout

    rien de plus
    Dernière modification par Invité ; 03/11/2009 à 12h47.

  17. #17
    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 comprendre a quoi peuvent bien servir les pointeur, on va faire une fonction qui echange les valeur de deux variable (a l'aide de la permutation circulaire).

    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
     
    void Echanger (int a, int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
     
     
    int main (void)
    {
        int premier = 1;
        int deuxieme = 2;
     
        printf ("premier - %d\n", premier);
        printf ("deuxieme - %d\n", deuxieme );
     
        Echanger (premier, deuxieme);
     
        printf ("premier - %d\n", premier);
        printf ("deuxieme - %d\n", deuxieme );
    }
    Si tu fais un test avec ceci, tu t'apercevra que le resultat est

    premier - 1
    deuxieme - 2
    premier - 1
    deuxieme - 2
    Pourtant, on a bien passer nos variable a la fonction Echanger mais cela semble ne pas avoir eu d'effet !

    La raison est simple, quant on passe une variable comme ceci, on fait une copie ! C'est a dire que la variable "premier" du main et la variable "a" de la fonction n'ont rien a voir. Elle ne sont pas lier.

    Le probleme maintenant est de reussir a faire en sorte que lorsqu'on modifie la variable "a" dans la fonciton Echanger, les effet se repercute sur la variable "premier" du main.
    Et pour cela, on utilise des pointeurs.


    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
     
    void Echanger (int *a, int *b)
    {
        int temp = (*a);
        (*a) = (*b);
        (*b) = temp;
    }
     
     
    int main (void)
    {
        int premier = 1;
        int deuxieme = 2;
     
        printf ("premier - %d\n", premier);
        printf ("deuxieme - %d\n", deuxieme );
     
        Echanger (&premier, &deuxieme);
     
        printf ("premier - %d\n", premier);
        printf ("deuxieme - %d\n", deuxieme );
    }
    Et la, le resultat est :

    premier - 1
    deuxieme - 2
    premier - 2
    deuxieme - 1
    Voila a qui serve les pointeurs. Honnetement, qu'ils soient dans la RAM ou autre n'as pâs de reelle importance au premier abord. si tu retient ce que j'ai expliqué plus haut, tu aura deja avancer un peu.

    en quoi n'est-ce pas propre d'utiliser une variable globale et pourquoi est-ce disons "mal vu" ?
    car en définitive c'est une solution pour ne pas perdre la valeur
    Oui, c'est une solution, cependant ce n'est pas forcement la meilleur solution.
    Lorsque tu fais une variable globale et que tu as beaucoup de fonction, tu risque tu modifier cette variable sans t'en apercevoir et tu aura des comportement indeterminé. Encore une fois, une variable global sur un tout petit programme n'a pas de reel impact, mais si tu prend cette habitude et que plus tard tu code de grosse appli, tu risque de t'en mordre les doigt.

    Autant essayer de comprendre maintenant les pointeur et surtout, ou est ce qu'une variable doit etre. Parce que si tu as besoins de ta variable dans 2 fonction alors que tu as 20 fonction, faire une variable global ...
    Bref, pour faire une variable global, faut bien la justifier.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Un café long svp... Sans sucre...

    Non je rigole

    cet exemple torture mon esprit

    je vais regarder ça encore de plus près

    PS :
    Citation Envoyé par SofEvans Voir le message
    La raison est simple, quant on passe une variable comme ceci, on fait une copie ! C'est a dire que la variable "premier" du main et la variable "a" de la fonction n'ont rien a voir. Elle ne sont pas lier.
    ah bon ? je ne savais pas : il me semblait pourtant que lors de l'appel de la fonction, 'a' prenait pour valeur 'premier' et 'b'=>'deuxieme'

    le problème n'est-il pas résolu en faisant ça :
    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
    void Echanger (int a, int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
     
     
    int main (void)
    {
        a = 1;
        b = 2;
     
        printf ("premier - %d\n", a);
        printf ("deuxieme - %d\n", b );
     
        Echanger (a, b);
     
        printf ("premier - %d\n", a);
        printf ("deuxieme - %d\n", b );
    }
    ??
    Dernière modification par Invité ; 03/11/2009 à 13h13.

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le passage des paramètres en C se fait par copie. C'est aussi pour ça que j'ai nommé mes variables différemment dans les deux fonctions (a et b pour main(), gauche et droite pour Echange()). Ça montre qu'on bosse sur deux choses différentes.

    Je prépare une explication plus détaillée.
    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.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Bon, j'ai voulu faire une bonne explication, mais c'est trop compliqué, alors voici une explication simple:
    Imagine que tu as tes quatres variables locales (a, b, pa, pb) aux emplacements respectifs 1000, 1001, 1002 et 1003 dans la mémoire. Eh bien dans ce cas, pa et pb vaudront respectivement 1000 et 1001 (les adresses de a et b).
    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.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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