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 :

Machine à états finis en C++


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Machine à états finis en C++
    bon alors voilà, j'ai parcouru le net sans succès pour essayer de trouver un code objet simple, permettant de décrire une machine à état finis.

    est ce que quelqu'un aurait çà dans une de ses bibliothèques en C++ ?

    thanks

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Je vois vaguement l'allure que ça peut prendre, mais ça n'a jamais été fort difficile d'implémenter ça avec un simple algo.
    En gros tu définis une énumération avec tes états, une variable contenant l'état actuel et tu boucles sur un switch pour lequel a été défini une action par état possible.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il y a plein de méthodes différentes de faire ce genre de choses, chacune avec ses propres avantages.

    Ca peut être une énum décrivant les états, et un gros switch selon l'état courant changeant celui ci (solution la plus rapide à mettre en oeuvre dans les cas simples, mais la plus difficile à maintenir et faire évoluer).

    Ca peut être une classe de base état, et une classe dérivée par état. Dans l'interface de cette classe de base sont définies les différentes fonctions de changement détat.

    Ca peut être une représentation sous forme de graphe, chaque état étant un noeud.

    Ca peut être plein d'autres choses.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il me semble qu'il y avait un projet pour ça dans boost.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Thanks pour vos réponses. Effectivement j'aimerai éviter un gros switch général, qui est la méthode la plus simple à mettre en oeuvre. Le projet tournant sur un PC, et n'étant pas embarqué sur un chip, j'ai plus de libertés pour régler çà par de jolies classes.

    Je cherchais donc quelque chose de facilement dérivable et réutilisable en objet.

    Bon au final j'ai pondu deux types de MEF :
    Le premier code essaie d'être exhaustif (aux erreurs de syntaxe et constructeurs prêt) :

    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
    class State
    {
    public :
    	int State_ID;
    	bool (*ptrFnToExecuteWhenEnteringState)();
    }
     
     
    class Transition
    {
    public :
    	int StateToLeave;
    	int StateToGo;
    	bool (*ptrTestFunction) ();
    	bool (*ptrExitFnIfTransitionOK)();
    }
     
     
     
    class GenericStateMachine
    {
    public :
    	GenericStateMachine();
    	~GenericStateMachine();
     
    	int GetCurrentState();
    	bool addState(int State_ID, bool (*ptrFnToExecuteWhenEnteringState)() );
    	bool addTransition(int StateToLeave, int StateToGo, 
    					   bool (*ptrTestFunction) (), bool (*ptrExitFnIfTransitionOK)() );
    private:
        int CurrentState;
    	std::vector<State> StateVector; 
    	std::vector<Transition> TransitionVector;
     
     
    }
    et le second a pour avantage d'être plus "visuel", puisque le tableau de transition de chaque état est en statique dans le code, et donc consultable d'un seul coup d'oeil pour vérifier comment est construite la MEF :

    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
    class StateMachine
    {
    public :
    	GenericStateMachine();
    	~GenericStateMachine();
     
    	enum State (ID_State1, ID_State2, ID_State3);
     
    	std::vector< std::vector<bool (*ptrFuncTransition)()> > Transition;
    	// ou son équivalent en C : ( bool (*ptrFuncTransition) () ) Transition [Max_State][Max_Transition];
     
    	int GetCurrentState();
     
    private :
    	int CurrentState;
     
     
    }
     
    GenericStateMachine::GenericStateMachine ()
    {
     
    	new Transition = {  // Transitions de l'état ID_State1
    			{ptrFuncTransition11, ptrFuncTransition12, ptrFuncTransition13},
     
    			// Transitions de l'état ID_State2
    			{ptrFuncTransition21, ptrFuncTransition22, ptrFuncTransition23},
     
    			// Transitions de l'état ID_State3
    			{ptrFuncTransition31, ptrFuncTransition32, ptrFuncTransition33},
    			}
    	etc...
    }
    cette deuxième solution a l'avantage donc d'être "statique" et de fournir une vision d'ensemble rapidement.

    Hé oui, venant du monde de l'embarqué, j'aime les choses statiques qui ne font pas exploser la mémoire ;oP On ne se refait pas.

    vous en pensez quoi ? aux erreurs de déclaration prêt ?

    Sinon Boost permet de traduire une MEF graphique en code directement c'est çà ? c'est gratuit ?


    PS : Zais, çà y est l'invasion des lapins a commencé

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    A mon avis, boost ne fourni rien de graphique pour ça. Par contre, c'est gratuit. Le truc sur les FSM est récent et pas encore officiellement accepté, je ne le connais pas.

    Ce que j'ai trouvé intéressant en terme graphique en terme de retour sur investissement, c'est non pas générer le code à l'aide d'un graphique (coûteux), mais générer un graphique à l'aide du code, afin de valider celui ci. Comment générer ce graphique simplement ? A l'aide de graphviz, on génère un fichier texte qui décrit un graphe, et il génère le graphique correspondant (c'est gratuit).

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    oui exact je connaissais graphviz.

    je regarderais boost alors. la conception graphique ne m'est pas utile ppour l'instant sur le projet

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    la partie graph de Boost est trop complexe pour mon problème finalement. J e n'ai pas besoin de code en fait qui respecte la théorie des graphes, mais seulement d'une petite machine à état

    donc nope, boost ne m'aidera pas sur mon sujet. Mais je le garde sous le coude pour d'autres appli

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pour ceux qui ne savent pas utiliser Google :
    http://boost-sandbox.sourceforge.net...doc/index.html

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    J'avais codé quelque chose, après avoir lu un "tuto" montrant une utilisation efficace du design pattern Etat.
    C'est à l'évidence quelque chose dont tu peux te servir dans ton projet.
    Cela mettait en scène une utilisation fine des templates. Vois si tu peux pas proposer une 3eme solution à base de Design Pattern Etat et de Templates

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    loufoque > utilisation de google ? là n'était pas la question....

    Alp : thx. n'étant pas un habitué des design patterns, j'ai fignolé mon code pour faire deux types de FSM : une "dynamique" où l'on peut ajouter à chaque instant états et transitions, et une "statique" (codée en dur) qui a l'avantage de permettre de lire la FSM directement d'un seul coup d'oeil.

    Le soft étant assez séquentiel, ce développement suffit dans un premier temps. Mais du coup je vais jeter un oeil aux design patterns pour d'autres fonctionalités du logiciel, et je regarderais si une modélisatoin par réseau de Pétri ne pourrait pas solutionner quelques problèmes à côté d'ailleurs tiens.

    Thanks pour vos avis à tous.

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

Discussions similaires

  1. Machine a états finis paramétrable
    Par fanfouer dans le forum Autres composants
    Réponses: 0
    Dernier message: 22/08/2012, 15h33
  2. machine à état fini (SFM) en C
    Par hamma007 dans le forum Embarqué
    Réponses: 1
    Dernier message: 30/04/2012, 16h35
  3. machine à état xml
    Par bassi44 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 19/02/2008, 08h58
  4. machine à état en java
    Par bassi44 dans le forum Général Java
    Réponses: 2
    Dernier message: 28/01/2008, 12h53
  5. [Etat-Transition] Relation avec les automates d'état finis vu en théorie des langages ?
    Par isma44 dans le forum Autres Diagrammes
    Réponses: 3
    Dernier message: 15/03/2007, 00h15

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