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 :

portée globale/locale dans fonction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut portée globale/locale dans fonction
    bonjour à tous!
    La fonction FcStrAlz analyse une chaine "1234..".
    Si un chiffre est présent devant la fonction un drapeau "0" empêche l'apparition d'une ligne.
    Mais la valeur du drapeau ne sort pas de la fonction...
    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
    47
    48
    49
    50
    51
     
    //analyse de chaine
    #include <iostream>
    #include <string>
    using namespace std;
     
     
    string FcStrAlz(string StrAlz,string StrItm)//fonction confrontant
    {//Fc/déb 13/09/11                          //un verrou "1"..."n"
    cout<<"-----------------------"<<endl;      //avec sa présence
         int taille = StrAlz.size ();           //dans la chaine StrAlz
         int t=0;                               //si verrou la ligne s'efface
         string ElmStrAlz,stp="0";              //si verrou absent ou ""
         cout<<"  /d/<"<<stp<<">"<<endl;        //la ligne apparaît
         while (t<taille)
              {ElmStrAlz=StrAlz.substr(t,1);
              t++;
              cout<<ElmStrAlz<<" ";
              if (ElmStrAlz==StrItm)
                  {stp="0";break;}              //si 0 efface ligne
                  else stp="1";                 //si 1 igne apparait
              }
              cout<<"/z/<"<<stp<<">"<<endl;
    cout<<"------------------------"<<endl;
         return stp;
    }//Fc/fin 13/09/11
     
     
    //prg essai
    string StrAlz="123456";//chaine des verrous possibles
    string Alz,StrItm,stp;
    int main ()
    {
        cout<<"ei-<"<<stp<<">-"<<endl;                                    //état stp entrée int main
            StrItm="1";                                                   //verrou "1" actionnant la L39
            Alz=FcStrAlz(StrAlz,StrItm);
        cout<<"1ex-<"<<stp<<">-ex pourquoi TOUJOURS VIDE!"<<endl;         //état stp sortie de fonction
            if (stp=="0")                                                 //ligne actionnée par L36
            {cout<<"§1 effacé"<<endl;}
            if (stp=="1")                                                 //cette ligne fonctionne pas car L36 a valeur "1"
            {cout<<"§1 apparaît"<<endl;}
     
            //ici pas de verrou 3 installé(on pourrait mettre StrItm="";)
            Alz=FcStrAlz(StrAlz,StrItm);
        cout<<"3ex-<"<<stp<<">-ex pourquoi toujours vide!"<<endl;         //état stp sortie de fonction
            if (stp=="0")                                                 //ligne fonctionne pas car L44 sans valeur
            {cout<<"§3 effacé"<<endl;}
            if (stp=="1")                                                 //ligne fonctionne car L44 sans valeur
            {cout<<"§3 apparaît"<<endl;}
        cout<<"0 pour sortir de int main";int zer;cin>>zer;
    }
    Où est l'erreur?
    Merci pour vos lumières.
    Sen.

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Citation Envoyé par senvedgi Voir le message
    Mais la valeur du drapeau ne sort pas de la fonction...
    La chaine stp globale n'est pas la chaine stp locale de ta fonction!!!!!!!
    En revanche, ta fonction retourne bien le contenu de du stp local de la fonction et affecte cette valeur à Alz dans le main. La fonction semble, elle, bien fonctionner à première vue.

  3. #3
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    Merci.Je vais revoir la notion globale/locale.
    Mais ne suis pas sûr de trouver.
    Sen.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par senvedgi Voir le message
    Merci.Je vais revoir la notion globale/locale.
    Mais ne suis pas sûr de trouver.
    Sen.
    1/ Toutes les variables déclarées dans des blocs {...} sont locales à ces blocs

    2/ Toutes les variables déclarées en dehors de tout bloc sont dites "ayant la portée du non d'espace", c'est à dire qu'elle sont globales dans le nom d'espace (namespace). Si il n'y a pas de nom d'espace, elles sont globales au programme.

    3/ une variable peut être cachée par une autre. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    voif function(int param) // param a par exemple la valeur 3
    {
      std::cout << "param = " << param << std::endl;
      int param = 4:
      std::cout << "param = " << param << std::endl;
      if (param != 3) {
        float param = 3.5f;
        std::cout << "param = " << param << std::endl;
      }
    }
    Dans ton code, tu définis une variable globale stp (en dehors de toute fonction ; ligne 31).

    Puis, dans la fonction FcStrAlz (sérieux, il manque des touches à ton clavier ? Et pourquoi Fc ? Tu avais peur de confondre la fonction avec une livre de beurre fondu ?), tu redéfini une variable stp locale (ligne 13) qui cache la variable stp globale.

    Du coup, les modifications de stp qui sont dans la fonction FcStrAlz ne modifie que la variable locale, et pas la variable globale.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    beurre fondu:quand je crée une fonction elle commençe toujours par Fc(+)XYZ.Les strings associées sont voisines voires identiques à XYZ pour pouvoir m'y retrouver aujourd'hui ...et plus tard(smiley vieux).Homogénéité oblige.
    Merci docteur pour le diagnostic.J'essaye de modifier astucieusement les déclarations de stp pour obtenir le résultat escompté et espère revenir bientôt pour présenter un travail fini Ou trouver une autre solution.
    Sen.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut
    Citation Envoyé par senvedgi Voir le message
    beurre fondu:quand je crée une fonction elle commençe toujours par Fc(+)XYZ.Les strings associées sont voisines voires identiques à XYZ pour pouvoir m'y retrouver aujourd'hui ...et plus tard(smiley vieux).Homogénéité oblige.
    A vrai dire, je ne suis pas partisan de cette notation (qui se rapproche de la notation hongroise) simplement parce que:
    • On se doute qu'une fonction est une fonction, et non une livre de beurre fondu ( )
    • il est beaucoup plus facile de s'y retrouver lorsque les fonctions, variables et types ont des noms clairs et explicites, et, surtout pas, des abréviations
    Le nom de tes fonctions, types et variable ne coute rien en terme de performance:
    une fonction nommée fcMachChose ne prendra pas plus d'espace en mémoire que la même fonction nommé faitMachinChoseAvecCeci, et, l'auto complétion aidant, cela ne te prendra même pas plus de temps pour écrire l'invocation de la deuxième que pour le faire pour la première.

    Par contre, la fonction "faitMachinChoseAvecCeci" sera beaucoup plus facile à comprendre lorsque l'on relira le code ( et tu n'es pas sans savoir qu'un code est beaucoup plus souvent lu / étudié qu'il n'est écrit / compilé ), ne serait ce que parce qu'on ne doit pas, en plus de tout le reste, se souvenir que l'on utilise "classiquement" str pour parler de chaine de caractères ou que Alz correspond à quelque chose de particulier (à quoi ca correspond, d'ailleurs )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    J'ajoute une précision :

    Si tu souhaite effectivement que la variable stp modifiée par ta fonction soit la variable globale stp il suffit de déclarer la variable globale stp avant ta fonction FcStrAlz et de ne pas redéclarer stp dans cette fonction.
    Voici une version ou la fonction modifie la variable globale:

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    //analyse de chaine
    #include <iostream>
    #include <string>
    using namespace std;
     
    //prg essai
    //Déclarér les variables globales
    string StrAlz="123456";//chaine des verrous possibles
    string Alz,StrItm,stp;
     
    string FcStrAlz(string StrAlz,string StrItm)//fonction confrontant
    {//Fc/déb 13/09/11                 //un verrou "1"..."n"
    cout<<"-----------------------"<<endl;//avec sa présence
         int taille = StrAlz.size ();   //dans la chaine StrAlz si verrou la ligne s'efface
         int t=0;						//si verrou absent ou "" la ligne apparaît
         string ElmStrAlz;
    	 stp="0";//Ne pas redéclarer stp sinon elle devient locale ( seulement l'initialiser )
         cout<<"  /d/<"<<stp<<">"<<endl;
         while (t<taille){
    		 ElmStrAlz=StrAlz.substr(t,1);
             t++;
             cout<<ElmStrAlz<<" ";
             if (ElmStrAlz==StrItm){
    			 stp="0";
    			 break;
    		 }              //si 0 efface ligne
             else
    			 stp="1";                 //si 1 igne apparait
    	 }
         cout<<"/z/<"<<stp<<">"<<endl;
    	 cout<<"------------------------"<<endl;
         return stp;
    }//Fc/fin 13/09/11
     
    int main ()
    {
        cout<<"ei-<"<<stp<<">-"<<endl;                                    //état stp entrée int main
        StrItm="1";                                                   //verrou "1" actionnant la L39
        Alz=FcStrAlz(StrAlz,StrItm);
     
        cout<<"1ex-<"<<stp<<">-ex pourquoi TOUJOURS VIDE!"<<endl;         //état stp sortie de fonction
        if (stp=="0"){                                              //ligne actionnée par L36
            cout<<"§1 effacé"<<endl;
    	}
    	if (stp=="1"){                                                 //cette ligne fonctionne pas car L36 a valeur "1"
    		cout<<"§1 apparaît"<<endl;
    	}
     
        //ici pas de verrou 3 installé(on pourrait mettre StrItm="";)
        Alz=FcStrAlz(StrAlz,StrItm);
        cout<<"3ex-<"<<stp<<">-ex pourquoi toujours vide!"<<endl;         //état stp sortie de fonction
    	if (stp=="0"){                                                 //ligne fonctionne pas car L44 sans valeur
    		cout<<"§3 effacé"<<endl;
    	}
    	if (stp=="1"){                                                 //ligne fonctionne car L44 sans valeur
            cout<<"§3 apparaît"<<endl;
    	}
        cout<<"0 pour sortir de int main";int zer;cin>>zer;
    }

  8. #8
    Membre très actif
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Par défaut
    Merci:çà marche!
    Ce qui me chagrine c'est l'obligation de déclarer la variable stp avant la FonCtion.La déclaration de stp "fait donc partie de la fonction"..
    D'autre part si ma fonction fonctionne en temps que telle l'utilisation de la chaine de verrous possible(StrAlz...123..) est mal foutue.Je vais revoir la conception de mon effacement sélectif de lignes de menu avant un switch(nn).
    En attendant merci pour la leçon globale/locale avec l'exemple fourni.

    Sen.

  9. #9
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Si je peux me permettre, l'utilisation de variables globales est fortement déconseillée ( car n'importe qui peut y accéder ) , il est toujours préférable d'utiliser des variables locales ( comme tu l'as fais dans ton premier programme ) et de récupérer la valeur souhaitée par retour ( comme tu l'avais fait; je me répète )

    Comme je vois que tu est débutant, je te conseille cette excellente lecture : Penser en C++ disponible gratuitement sur ce site

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

Discussions similaires

  1. [Débutant] Les variables globales et locales dans les fonctions
    Par zakimadrid dans le forum MATLAB
    Réponses: 8
    Dernier message: 28/04/2015, 01h34
  2. Réutilisation de variable Locale dans fonction differente
    Par Luke spywoker dans le forum Général Python
    Réponses: 4
    Dernier message: 09/07/2010, 09h13
  3. portée flux de fichier dans fonction
    Par Miko95 dans le forum C++
    Réponses: 3
    Dernier message: 11/01/2008, 10h18
  4. Réponses: 2
    Dernier message: 08/04/2007, 22h24
  5. pb: affecter durablement l'id d'un objet (portée globale et non locale)
    Par pit9.76 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/06/2006, 11h19

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