Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire un compteur dans une fonction

    25 août 2021 à 19:12:18

    Bonjours ,en gros je voudrais faire c'est un compteur déclarer dans une fonction et qui augmenter dans cette même fonction mais sans se reset à chaque fois.j'en ai mare de déclarer en variable global (ce qui est plutôt dangereux)ou de le passer par paramètre
    • Partager sur Facebook
    • Partager sur Twitter
      25 août 2021 à 20:23:57

      Déclarer une variable locale statique (mais c'est un peu une variable globale déguisée, mais en moins pire).
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        25 août 2021 à 21:33:12

        bacelar a écrit:

        Déclarer une variable locale statique (mais c'est un peu une variable globale déguisée, mais en moins pire).


        T'aurais un exemple car les seul cas de variable statique c'est dans les class donc je sais pas si ça fonctionne de la même manière.
        • Partager sur Facebook
        • Partager sur Twitter
          25 août 2021 à 22:08:15

          void toto(){
              static int titi = 0;
              titi++;
          }
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            17 septembre 2021 à 14:31:04

            Sauf qu'aprés on a du mal à accéder à la valeur de la variable statique, qui est planquée dans la fonction.

            -
            Edité par michelbillaud 17 septembre 2021 à 14:33:54

            • Partager sur Facebook
            • Partager sur Twitter
              17 septembre 2021 à 15:04:11

              Et le "++" n'est pas thread-safe, mais le PO n'est pas très loquace sur l'usage de son compteur.
              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                17 septembre 2021 à 16:00:44

                michelbillaud a écrit:

                Sauf qu'aprés on a du mal à accéder à la valeur de la variable statique, qui est planquée dans la fonction.

                Et bien on retourne la valeur :

                int toto()
                {
                    static int titi = 0;
                    titi++;
                    return titi;
                }




                • Partager sur Facebook
                • Partager sur Twitter
                  17 septembre 2021 à 16:05:52

                  A condition que le rôle de la fonction ne soit pas déjà de retourner quelque chose.

                  A part ça, l'usage d'une variable globale n'est pas dangereux en soi, sinon que ca ne va evidemment pas etre thread-safe (ce qui n'est pas forcement un besoin). On peut la planquer dans un espace de noms, par exemple.

                  Ça vaut mieux que de tordre la conception du programme par flemme de passer des paramètres.

                  -
                  Edité par michelbillaud 17 septembre 2021 à 16:13:59

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 septembre 2021 à 16:53:55

                    michelbillaud a écrit:

                    A condition que le rôle de la fonction ne soit pas déjà de retourner quelque chose.

                    Et oui, avec des scies on en fait des choses.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2021 à 18:02:51

                      Zero.c a écrit:

                      michelbillaud a écrit:

                      A condition que le rôle de la fonction ne soit pas déjà de retourner quelque chose.

                      Et oui, avec des scies on en fait des choses.

                      ouais, couper l'eau tiède, par exemple.

                      Bon, voila une solution avec un espace de noms anonyme.

                      Le main.cc appelle 2 fois une fonction, et affiche ensuite le compteur

                      #include <iostream>
                      #include "somme.hh"
                      
                      int main() {
                      	std::cout << somme(2,2) << std::endl;
                      	std::cout << somme(3,4) << std::endl;	
                      	std::cout << "la fonction a été appelée "
                      			  << nb_appels_somme() << " fois." << std::endl;
                      }
                      

                      Ce qui provoquera le résultat

                      $ ./main 
                      4
                      7
                      la fonction a été appelée 2 fois.
                      


                      Le fichier d'entête somme.hh est sans surprises

                      #ifndef SOMME_HH
                      #define SOMME_HH
                      
                      int somme(int a, int b);
                      int nb_appels_somme();
                      
                      #endif
                      

                      et somme.cc définit les deux fonctions, avec un compteur protégé dans un espace de noms anonyme

                      #include "somme.hh"
                      
                      namespace {
                      	int compteur = 0;
                      }
                      
                      int somme(int a, int b) {
                      	compteur ++;
                      	return a + b;
                      }
                      int nb_appels_somme() {
                      	return compteur;
                      }
                      

                      Pour faire bon poids, le Makefile

                      CXXFLAGS = -Wall -std=c++11 -Werror
                      
                      main: main.o somme.o
                      	$(LINK.cc) -o $@ $^
                      







                      -
                      Edité par michelbillaud 18 septembre 2021 à 18:05:10

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Faire un compteur dans une fonction

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown