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

Langage C++ Discussion :

trace en c++ simplifié


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut trace en c++ simplifié
    bonjour,

    je me suis remis il y a peu au C++ et je constate que j'ai pas mal perdu la main

    voilà, j'essaie de créer un petit quelque chose pour faire une trace. je ne veux pas de librairie, je souhaite faire quelque chose d'extrêmement simple.

    pour ce faire (en résumé et simplifié), j'ai créé une fonction statique, une liste de string et un mutex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static std::list<std::string>* liste = new std::list<std::string>();
    static sf::Mutex* mutex = new sf::Mutex();
     
    static void AddTrace(std::string message) {
    mutex->Lock();
    liste->push_back(message);
    mutex->Unlock();
    }
    Voilà, ensuite, à la fin de mon programme, je fais un std::cout de l'ensemble et là rien n'est affiché.
    En fait, il me dit que la taille de ma liste est de 0. Pourtant aucun message quel qu'il soit et aucune erreur durant l'exécution.

    Comme cela fait un bail que je n'ai pas touché à du C++, je suppose qu'il y a un souci avec ma façon de m'y prendre ?
    Qu'auriez-vous fait ?

    Merci !
    "Computers are like Old Testament gods ; Lots of rules and no mercy"
    [ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

  2. #2
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    bon allez je met mon code parce que j'ai l'impression que je n'ai vais pas avoir d'aide sinon

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #ifndef TRACE_HPP_
    #define TRACE_HPP_
     
    #include <SFML/System.hpp>
    #include <iostream>
    #include <list>
    #include "Conversions.hpp"
    #include <time.h>
     
    namespace pro
    {
      namespace system
      {
        namespace trace
        {
          /*
           * Une trace c'est un message à un instant donné
           */
          struct Trace
          {
              Trace(std::string message)
              {
                Message = message;
                Temps = time(NULL);
              }
     
              std::string Message;
              std::time_t Temps;
          };
     
          // active ou non les traces
          static bool tracesActivatees = true;
     
          // mutex pour l'ajout des traces car la liste est partagée
          // TODO ne marche pas, pourquoi ? à cause du contexte d'exécution ?
          static sf::Mutex* mutexTraces = new sf::Mutex();
     
          // liste partagée des traces
          static std::list<Trace*>* traces = new std::list<Trace*>();
     
          // stocke une trace
          static void Add(std::string message)
          {
            if (tracesActivatees)
            {
              mutexTraces->Lock();
              traces->push_back(new Trace(message));
              mutexTraces->Unlock();
            }
          }
     
          // affiche toutes les traces et nettoie une fois que c'est terminé
          static std::string Show()
          {
            /* si Show a déjà été appelé, on quitte directement
             car les pointeurs sont NULL */
            if (traces == NULL)
            {
              return "";
            }
     
            // si on appel cette fonction, elle bloque les traces suivantes
            if (tracesActivatees)
            {
              tracesActivatees = false;
            }
     
            std::size_t nbTraces = traces->size();
            std::string sortie = "========== TRACES (" + Size2String(&nbTraces)
                + ") ==========\n";
            std::list<Trace*>::iterator iterateurTrace = traces->begin();
            while (iterateurTrace != traces->end())
            {
              sortie += (": [" + Time2String(&((*iterateurTrace)->Temps)) + "] "
                  + (*iterateurTrace)->Message + "\n");
              ++iterateurTrace;
            }
     
            traces->clear();
            delete traces;
            traces = NULL;
     
            delete mutexTraces;
            mutexTraces = NULL;
     
            return sortie;
          }
        }
      }
    }
     
    #endif
    typiquement dans mon code, je fais des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pro::system::trace::Add("Une trace");
    puis à la fin de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pro::system::trace::Show();
    cela doit tout afficher mais il me dit que la liste est vide.
    "Computers are like Old Testament gods ; Lots of rules and no mercy"
    [ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Quand tu dis 'à la fin de mon code', cela veut dire à la fin du main ou à la destruction d'une variable globale ?

  4. #4
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    à la fin du main. tout le long du code j'ajoute des string, juste avant le return EXIT_SUCCESS j'essaie d'afficher. pourquoi c'est lié ?
    "Computers are like Old Testament gods ; Lots of rules and no mercy"
    [ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

  5. #5
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjours,
    A la fin du code, ne faudrait t'il pas sortir le résultat de Show dans cout??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << pro::system::trace::Show();
    A part ca je ne vois pas.

  6. #6
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    si, c'est exactement ce que je fais pardon. je pense que je vais relancer le debugger. il doit y avoir un problème avec le contexte d'exécution ou quelque chose comme çà...
    "Computers are like Old Testament gods ; Lots of rules and no mercy"
    [ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

  7. #7
    screetch
    Invité(e)
    Par défaut
    tes onctions et tes variables sont statiques et dans un en-tete
    cela veut dire que tout fichier incluant ton en tete va posseder sa propre copie du code et des variables.

    en gros main.cpp a une certaine liste chainée
    et test.cpp en a une autre

    deplace le code source dans un fichier séparé et n'inclut pas tout dans le header.

  8. #8
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    bon effectivement, j'ai créé une classe. je créé une instance dans le main puis je donne un pointeur du traceur à tous ceux qui en ont besoin. enfin, à la fin, j'affiche tout. plus de variables globales, plus de static, tout en objet c'est finalement beaucoup plus simple !
    "Computers are like Old Testament gods ; Lots of rules and no mercy"
    [ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

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

Discussions similaires

  1. Trouver les redirections dans des traces
    Par severine dans le forum Développement
    Réponses: 3
    Dernier message: 21/04/2004, 18h51
  2. Réponses: 7
    Dernier message: 26/02/2004, 09h32
  3. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59
  4. [xsl] affichage arbre simplifié
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 11/06/2003, 11h11

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