GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

[C] la Question de la Honte !

2 participants

Aller en bas

[C] la Question de la Honte ! Empty [C] la Question de la Honte !

Message par Tryphon Lun 10 Sep 2018 - 18:54

Je me pose une question sur les machines à état...

Pour l'instant, pour chaque état de ma machine à état, j'ai 2 fonctions :

* une fonction init qui s'occupe de l'initialisation de l'état (animation, physique), elle ne s'exécute que la première fois

* une fonction update, qui est exécutée à chaque frame, et qui, comme son nom l'indique, met à jour l'état et regarde s'il faut en changer

Typiquement, on a (je retourne à la ligne à chaque frame) :

Code:
init_A
update_A
update_A -> init_B
update_B
update_B
etc.

Sauf que souvent, la fonction init doit appeler la fonction update dans la même frame : j'aimerais avoir :

Code:
init_A
update_A
update_A -> init_B -> update_B
update_B
etc.

Mais ça me gêne un peu parce que chaque -> est un appel de fonction, donc écriture de l'adresse de retour dans la pile, et si on imagine que update_B appelle init_C qui appelle update_C , etc., on va se retrouver avec plein d'appels imbriqués, donc de potentiels problèmes de dépassement de pile, des ralentissements, alors que ces retours de fonctions sont inutiles.

Du coup...

J'ose à peine le dire...

Je me demande si ça serait pas un boulot pour l'instruction goto...

Genre :

Code:
void init_A(Object *self) {
 ...
 goto update_A_body;
}

void update_A(Object *self) {
 update_A_body:
 ...
}

Suis-je irrémédiablement maudit par les dieux de la programmation structurée ou est-ce que mon raisonnement se tient et je suis dans un des rares cas où le recours à goto est défendable ?
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Invité Lun 10 Sep 2018 - 19:02

Je me demande si ça serait pas un boulot pour l'instruction goto...
Si c'est ce que tu cherches, je pense qu'un GOTO pourrait être vu comme une jump table, par contre pour faire ça en C .
Mais si j'ai bien compris y'a des fonctions ré-entrantes dans ton code ??  scratch
avatar
Invité
Invité


Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Tryphon Lun 10 Sep 2018 - 19:05

Non, c'est pas vraiment une jump table. Ce serait plutôt une fonction à double point d'entrée. Je sais que certains compilos sont capables d'optimiser et de changer un jsr suivi d'un rts par un bra, mais pas tous.

Goto existe en C. Il y a un complot international qui empêche tout tuto d'en parler, mais il est dans le standard [C] la Question de la Honte ! 435303
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Hpman Lun 10 Sep 2018 - 19:07

Il accepte les goto cross fonction le C? c'est un deglingo [C] la Question de la Honte ! 418468

Si t'as vraiment peur pour la pile (faut quand même y aller) , mets un flag pour savoir si il faut encore update l'objet, puis colle un while.

Code:
update();
while(obj.busy)
    update();
avatar
Hpman
Patient contaminé

Masculin Nombre de messages : 669
Age : 46
Localisation : Lille
Date d'inscription : 22/08/2014

Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Invité Lun 10 Sep 2018 - 19:09

un GOTO variable en asm c'est un jmp ou un jsr dans un pointeur "de fonction", tu changes l'adresse du pointeur pour sauter vers ton entrée .

EDIT: sinon un flag comme dit hpman.
avatar
Invité
Invité


Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Hpman Lun 10 Sep 2018 - 19:15

Ou alors si tu veux avoir la classe:

Code:
while(update());

Et tu renvoies true/false en fonction

salut


Dernière édition par Hpman le Lun 10 Sep 2018 - 19:37, édité 1 fois
avatar
Hpman
Patient contaminé

Masculin Nombre de messages : 669
Age : 46
Localisation : Lille
Date d'inscription : 22/08/2014

Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Tryphon Lun 10 Sep 2018 - 19:33

Ouaille. Mais ça introduit un mécanisme assez lourd pour finalement un truc qui a peu de chance de se produire...

Mais t'as raison, y'a peu de chances que tu puisses faire un goto entre fonctions.

Mais je suis sûr d'avoir vu un jmp entre 2 fonctions dans du code compilé, donc le compilateur doit savoir gérer ce genre d'optimisation.

Mais c'était sur PS2...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Invité Lun 10 Sep 2018 - 19:35

en asm un goto entre 2 fonctions est faisable,en C j'en doute .
avatar
Invité
Invité


Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Tryphon Lun 10 Sep 2018 - 19:37

Je sais. Mais en C, pour des histoires de signature, ça m'étonnerait...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

[C] la Question de la Honte ! Empty Re: [C] la Question de la Honte !

Message par Hpman Lun 10 Sep 2018 - 19:39

Encore plus fort, en asm on peut goto dans du data rambo
avatar
Hpman
Patient contaminé

Masculin Nombre de messages : 669
Age : 46
Localisation : Lille
Date d'inscription : 22/08/2014

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum