|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Bonjour à vous
Je viens de penser à mettre en forme une espèce de machine état. Pour cela j'utilise une classe template de base : une sorte de cellule de base pour la machine état : Code :
Code :
J'ai donc 2 questions : comment avec une structure similaire parvenir à accéder à chaque élément du tuple de manière rapide à la manière d'un get<N> de boost::tuple et comment optimiser ce que j'ai fait ou le remodeler de manière à disposer de quelque chose de simple à initialiser et à utiliser ? |
||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Salut,
Pourquoi se faire du mal inutilement... As tu jeté un oeil à boost, il y a deux bibliothèques de machines à état, dont l'une bien aboutie me semble-t-il
__________________
en bas de page
|
|
|
10
|
|
|
#3 |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Merci du tuyau
Edit : Oui ça m'a l'air d'être ça, enfin il faudra déjà que je comprenne comment ça fonctionne vu le nombre de chose qu'il semble être possible de faire. Surtout que le tutoriel est en anglais et que sur un "sujet" assez compliqué c'est jamais trop facile quand on a pas l'habitude ^^ |
|
|
00
|
|
|
#4 | ||
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Quelqu'un pourrait-il m'expliquer pourquoi lorsque je déclare (toujours à partir du code précédent) :
Code :
Code :
error: use of deleted function 'boost::shared_ptr<CellStateMachine<float> >::shared_ptr(const boost::shared_ptr<CellStateMachine<float> >&)' |
||
|
|
00
|
|
|
#5 |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 060 ![]() |
Bonsoir,
Ça compile chez moi (on a pas les implémentation de tout les constructeurs, donc je les ai laissé vides). Tu pourrais donner un code complet minimal qui donne le même message ? (ie tu prends ton projet, tu le copies, tu enlèves tout ce qui sert à rien, tu mets tout dans un seul fichier, et tu copies le contenu sur le forum) Ça permettra de te donner une réponse vraiment appropriée. Par contre, pourquoi utiliser la syntaxe C++11 mais boost pour les shared_ptr/function ? En général si le compilateur supporte les variadics, la bibliothèque standard associée aura shared_ptr/function dans std. Si ta structure est similaire à un tuple, pourquoi ne pas utiliser un tuple justement (std::tuple) ?
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
00
|
|
|
#6 | ||||||
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Oui je posterai bientôt un exemple complet de code.
Pour ce qui est du tuple je ne peux pas utiliser la classe tuple de boost (ou de std) puisque justement je ne veux pas avoir un tuple contenant des types divers mais un tuple contenant des CellStateMachine de type divers donc il faudrait découper le template variadic au dessus d'une SuperCellStateMachine au niveau de chacun des paramètres et ça la classe tuple de boost ne le fait pas (ou alors dîtes moi comment faire en l'utilisant). Edit : Voici le code : main.cpp : Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#7 | ||
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 060 ![]() |
Je vais regarder ton code, mais en attendant, tu as essayé des syntaxes comme :
Code :
Edit: J'ai regardé ton code. Quel sont ton compilateur et ta version de boost ? Avec gcc 4.7 et boost 1.52 ton code compile sans problèmes (je n'ai fait que copier/coller et n'ai pas vérifier si il fonctionne comme attendu par contre).
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
||
|
|
00
|
|
|
#8 | |||
![]() ![]() |
Citation:
La notion de tuple, c'est comme la notion de file, de pile ou de list: c'est une notion tout à fait générique qui va contenir ce que tu veux que cela contienne Un tuple n'est en fait jamais qu'un ensemble de données qui permettent de représenter "quelque chose" Partant de là, tu peux très bien considérer l'idée de regrouper différents états dans un tuple pour qu'ils représentent les différents états d'une machine à états, où serait le problème Au pire, tu délègues à une classe ou à une fonction le fait de vérifier que chaque élément de ton modèle variadique est bien un pointeur vers un objet dont le type est dérivé de CellStateMachine; et, avec le static_assert, tu peux avoir des messages d'erreurs particulièrement intéressants Code :
__________________
en bas de page
|
|||
|
|
00
|
|
|
#9 | |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Citation:
En ce qui concerne ma version de gcc, il s'agit de la dernière (4.7) et pour celle de boost je ne sais pas exactement, juste qu'elle est assez récente, mais je ne sais pas si c'est la dernière ! @koala01 : En fait je pense m'être mal exprimé, enfin j'ai mal compris le concept exact de machine état. En effet, ce que je voudrais parvenir à faire est un ensemble de classe permettant de greffer des modules d'analyse d’événements et de temps agissant sur les cellules de la "machine état", cellules utilisées notamment à des fins graphiques, par exemple la position d'un sprite à l'écran, la couleur d'un pixel ... La liste de pointeurs de fonctions dans la cellule étant bien sur utilisée pour modifier dans les classes concernées les attributs notamment graphiques lors du changement de valeur dans la cellule. |
|
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Après test je dispose de la version 1.46.1 de boost.
Edit : Je viens d'installer la dernière version et maintenant ça compile (même si je ne comprends toujours pas pourquoi ça ne compilait pas avant ^^) |
|
|
00
|
|
|
#11 | |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 1 060 ![]() |
As-tu essayé :
Code :
std::tuple<SuperCellStateMachine<Arg>...> Et sinon : Citation:
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
|
00
|
|
|
#12 | |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Oui je suis en train de voir ça.
Sinon le std::shared_ptr est "le même" que le boost::shared_ptr ? (c'est juste pour savoir) Edit : Citation:
J'aimerais également savoir ce que vous pensiez sur l'avantage de la machine à état par rapport à ce que je suis en train de faire, et également si il existait un concept qu'y s'y rapproche plus. |
|
|
|
00
|
|
|
#13 | ||
|
Invité régulier
![]() Inscription : mai 2011 Messages : 5 ![]() |
std::shared_ptr est inspiré de boost::shared_ptr donc c'est à peut de choses près les mêmes.
D'ailleurs la bonne façon d'allouer un shared ptr c'est: Code :
|
||
|
|
00
|
|
|
#14 |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Merci pour ta réponse.
Un problème de conception maintenant : Est-il envisageable de respecter un design objet en établissant une instance statique d'une sorte de "mémoire centrale" composée de nombreuses données membres (spécifiques et spécifiée pour chaque nouveau programme utilisant la classe concernée) pouvant être modifiées depuis n'importe quel endroit du programme et utilisées de la même manière. Je me demandais si cela pouvait être viable car cela constituerait en quelque sorte une seconde "mémoire" accessible et modifiable partout. Je trouvais cela utile par exemple ne serait-ce que pour un jeu. En effet, pourquoi vouloir à tout prix diversifier le code source en une multitude insensée de classes peu réutilisables alors qu'il serait possible de mettre en place un système beaucoup plus souple où la majorité des variables de jeu quelles qu'elles soient seraient centralisées et où des éléments d'analyse et de modification très modulables seraient "greffés" au programme ? En espérant n'avoir pas été trop confus |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com