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 :

Observer l'état d'une variable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut Observer l'état d'une variable
    Salut à tous

    Ma question va sûrement vous paraître triviale, mais je ne trouve pas de réponse.

    Voici un bout de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int status;
     
    status = fileReceptor.read(AUTO_DELAY, m_command_auto_delay);
    if(status != SUCCESS_OPERATION) return status;
    status = fileConfig.read(DURATION_CYCLE, m_duration_cycle);
    if(status != SUCCESS_OPERATION) return status;
    status = fileConfig.readDelays(m_date, m_date_passage_meridien, m_listDelays);
    if(status != SUCCESS_OPERATION) return status;
     
    return SUCCESS;
    Comme vous le voyez c'est très répétitif, et j'aimerais améliorer ce code.
    J'aimerais observer le status, et dès qu'il passe à une certaine valeur je stoppe.
    Au début j'avais codé une boucle while, mais je me suis dit qu'il regardait le status seulement à la fin de la boucle, donc si ça plante au milieu, ça ne se verra pas.

    Il doit sûrement y avoir un autre moyen, tout con en plus, mais je ne vois pas

    Merci de m'apporter votre aide

  2. #2
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Hello,
    Pourquoi pas enregistrer tes fonctions 'read' dans un vecteur de boost::function<int()>. Tu peux ensuite les appeler dans une simple boucle for:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(int i=0; i< functions.size(); i++)
    {
         if( !functions[i]() )
             break;
    }
    C'est peut être également faisable avec boost.signal s'il y a moyen de spécifier une condition d'arrêt.

    EDIT: si tu n'as que trois conditions à tester, ca ne vaut peut être pas le coup de chercher à optimiser...

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Pour éviter de tester partout les codes erreurs, on recourt généralement à une gestion par exception (par exemple, en wrappant la méthode read si tu ne peux pas la modifier, et en lançant une exception si le status_code est différent de SUCCESS_OPERATION).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Salut à vous deux, vos réponses sont intéressantes

    Je vais regarder le fonctionnement de boost::function. En fait j'ai plusieurs dizaines de conditions comme ça a tester, c'est pour ça que je cherche à économiser les lignes de code.

    @white_tentacle: tu entends quoi par "wrapper la méthode read" ? L'idée serait de faire un throw(exception) dans la méthode read, et un catch dans les méthodes qui utilisent read ?

  5. #5
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    C'est l'idée.

    C'est intéressant si tu as besoin de savoir qu'un traitement a réussi dans son intégralité, ou qu'il a échoué, mais pas forcément de savoir où il a échoué.

    Du coup, tu peux te permettre un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try 
    {
      instruction1;
      instruction2;
      instruction3;
    }
    catch(readexception&)
    {
      // traitement qui ne dépend pas de l'instruction qui a échoué
    }
    Ici, vu que tout ce que tu fais, c'est retourner l'erreur renvoyée en cas d'erreur, ça me semble approprié.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Je trouve le principe super, mais en pratique j'ai des difficultés à lancer des throw :s

    Par exemple j'ai une fonction read qui pour l'instant fonctionne comme ç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
     
    //cette fonction ne lit pas dans un fichier mais dans un vector de string.
    int File::read(int lineNumber, int & sortie) {
    	if(!m_lines.empty() && lineNumber < (int) m_lines.size()) {
    		try {
    			sortie = atoi(m_lines.at(lineNumber).c_str());
    			return SUCCESS_READING;
    		} catch(exception &e) {
    			cout << "You must clean the file before reading.";
    			cout << e.what();
    			return FAIL_READING_CONFIG;
    		}
    	} else {
    		cout << "The container is empty, or the index is out of range." << endl;
    		return FAIL_READING_CONFIG;
    	}
    }
    Ici l'idée c'était de faire un throw si la conversion avec atoi a échouée, mais je ne vois pas comment procéder, à part relancer l'exception

Discussions similaires

  1. Afficher une image en fonction de l'état d'une variable
    Par lcoulon dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 02/05/2011, 19h25
  2. Réponses: 5
    Dernier message: 29/07/2009, 09h00
  3. Réponses: 4
    Dernier message: 08/01/2007, 14h48
  4. Envoyer une variable dans un état
    Par uskiki85 dans le forum Access
    Réponses: 5
    Dernier message: 13/10/2005, 21h44
  5. tester l'état d'un bit d'une variable
    Par jphi5 dans le forum C
    Réponses: 5
    Dernier message: 15/09/2003, 13h17

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