OVH Cloud OVH Cloud

Procédure maîtresse

20 réponses
Avatar
fraction
Bonjour
Il m'arrive de demander =E0 un module d'en appeler un autre. Mais une
fois que le deuxi=E8me a accompli sa t=E2che, il ne renvoie pas la main.
J'ai une solution, mais elle est compliqu=E9e. Comment faire simplement ?

10 réponses

1 2
Avatar
Vincent Guichard
Le 23/12/2009 17:52, fraction a écrit :
Par exemple, mon module volonté doit déduire les propriétés de n
combinaisons :

public compteur as integer

module volonté :
public sub simulation()
compteur=compteur+1
déduction.exécution(compteur)
if compteur=n then
end
endif
end sub

module déduction :
public sub exécution(x)
blablabla
volonté.simulation
end sub



Sauf que là, j'ai mis la condition de sortie après.



Si j'analyse bien ton code, il va empiler les appels à exectution et à
simulation de façon infinie (la condition de terminaison (end) n'arrive
jamais puisque tu appelles TOUJOURS execution avant, relancant par la
même une nouvelle instance de simulation). Tu va finir par exploser la
pile d'appel (si cela n'explose pas avant autre part).
Par ailleurs, End quitte le programme, pas la procédure (pour quitter l a
procédure c'est Exit Sub).
Ensuite, si tu modifie x dans le blablabla d'execution, vérifie que x
est passé par référence si tu veux que compteur soit modifié (sin on la
modification restera locale à cette instance de execution).
Enfin, Si tu dois vraiment utiliser un compteur et que celui-ci n'est
accédé directement que dans simulation, utilise de préférence une
variable statique propre à la procédure (voir mot clef static) qui se ra
donc commune à toute les instances de simulation, plutôt qu'une varia ble
publique.

Sur ce, je pars en vacances jusqu'au 04/01

Bonnes fêtes à tous,

Vincent Guichard
Avatar
fraction
On 23 déc, 18:23, Vincent Guichard wrote:
Le 23/12/2009 17:52, fraction a écrit :





>> Par exemple, mon module volonté doit déduire les propriétés de n
>> combinaisons :

>> public compteur as integer

>> module volonté :
>> public sub simulation()
>> compteur=compteur+1
>> déduction.exécution(compteur)
>>     if compteur=n then
>>     end
>>     endif
>> end sub

>> module déduction :
>> public sub exécution(x)
>> blablabla
>> volonté.simulation
>> end sub

> Sauf que là, j'ai mis la condition de sortie après.

Si j'analyse bien ton code, il va empiler les appels à exectution et à
simulation de façon infinie (la condition de terminaison (end) n'arrive
jamais puisque tu appelles TOUJOURS execution avant, relancant par la
même une nouvelle instance de simulation). Tu va finir par exploser la
pile d'appel (si cela n'explose pas avant autre part).
Par ailleurs, End quitte le programme, pas la procédure (pour quitter l a
procédure c'est Exit Sub).
Ensuite, si tu modifie x dans le blablabla d'execution, vérifie que x
est passé par référence si tu veux que compteur soit modifié (sin on la
modification restera locale à cette instance de execution).
Enfin, Si tu dois vraiment utiliser un compteur et que celui-ci n'est
accédé directement que dans simulation, utilise de préférence une
variable statique propre à la procédure (voir mot clef static) qui se ra
donc commune à toute les instances de simulation, plutôt qu'une varia ble
publique.

Sur ce, je pars en vacances jusqu'au 04/01

Bonnes fêtes à tous,

Vincent Guichard



J'ai dit que j'avais mis la condition de sortie trop tôt dans mon
exemple. En tout cas ça marche bien comme ça.
Bonnes fêtes et bonnes vacances à toi.
Avatar
LE TROLL
Mais si il y a plein de raisons pour que ça ne revienne pas, je l'ai écrit
dans ma réponse, "la première", dont tu ne t'es même pas donné la peine de
la lire !
c'est que tu appelles n'importe comment tes modules en boucle, et, ou que
tes fonction sont si mal écrites que ça boucle dedans.

Je t'ai donné la marche à suivre, alors en pratique tu fais un fichier LOG
et tu l'alimentes à chaque entrée et sortie de modules et fonctions, et
rapidement tu va voir où ça ne fonctionne pas, c'est pas seulement fait pour
les chiens les fichiers LOG, et c'est normalement comme ça qu'on fait !

Parade, parade, la seule parade c'est de trouver ! De shunter n'exclut pas
que tes procédures vérolées font peut être tourner dix fois le même calcul
et perdent du temps, il faut trouver la cause.

Ça va t'occuper à la place du réveillon !

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"fraction" a écrit dans le message de
news:
On 23 déc, 15:45, "Driss HANIB" wrote:
Salut fraction

Je pense comme Vincent que tu devrais nous faire quand une petite démo de
tes appels

tu peux shunter la partie appel de procédures dans le même module.
mais nous faire voir quand même comment c'est construit..
Car si tu appelles ta procédure à l'intérieur d'une procédure "maîtresse"
il
n'y a aucune raison que cela ne revienne pas.

As tu essayé le mode pas à pas. c'est sans doute fastidieux, mais très
intéressant pour debugger.

essaie en simplifiant de nous faire voir un bout de ta démarche.

Driss



C'est-à-dire que maintenant que j'ai trouvé la parade, il m'est
difficile de revenir en arrière et de vous exposer le problème
concrètement. Mais je vous fais confiance, "il n'y a aucune raison que
cela ne revienne pas". Il s'agit probablement d'un problème
d'interprétation de ma part. A l'avenir, je n'utiliserais plus cette
parade.
Avatar
LE TROLL
On ne programme pas à partir d'Excel, on paramètre à partir d'Excel ! Et ce
n'est pas compilé mais interprété, c'est lent !

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"fraction" a écrit dans le message de
news:
On 23 déc, 17:06, "Driss HANIB" wrote:
Salut Fraction

OK pour cela.
Regarde quand même tout de suite si tu peux comiler ton projet.
Cela serait dommage que tu avance de plus en plus dans ta parade et que tu
sois bloqué à la compilation.

Driss



Je programme à partir d'Excel. Je n'ai pas à compiler, enfin je crois.
Avatar
LE TROLL
Bonjour,

Ben oui, tu as tout à fait raison, on doit trouver la cause, d'autant
que c'est assez facile, suffit d'un bon log qui cafarde tout...

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Vincent Guichard" a écrit dans le message de
news:4b3246d8$0$924$
Le 23/12/2009 15:35, fraction a écrit :

Je ne comprends pas le problème. Qu'entends-tu par "appeler un module"?
En général, on appelle une fonction d'un module, pas le module lui-même.
Et le retour d'un fonction est automatique (sauf si la fonction contient
une boucle infinie).
Peux-tu donner un exemple de code?

Vincent Guichard



Oui, tu as raison. J'appelle une procédure d'un module, elle-même
appelle d'autres procédures de ce même module. Mais une fois cette
exécution terminée, elle ne renvoie pas la main. Le code est trop
compliqué pour l'écrire ici.
J'ai peut-être fait une erreur.
Ça m'arrive rarement. Et j'ai trouvé la parade en déclarant une
variable publique et en demandant à la procédure fille de revenir en
arrière.



Comment donc peux-tu demander à la procédure fille de revenir en
arrière? Et comment une variable publique peut-elle bien corriger un
problème tel que tu le décris? Je subodore un grave problème de
conception de l'application. Faute du code complet, peut être
pourrais-tu indiquer une pile des appels? Et donner la "parade" que tu
as trouvé?

Voici les choses telles que je les comprends, avec les informations
limitées que j'ai. Tu appeles une fonction (ou une procédure) qui se
trouves dans ton module. Cette fonction ne retourne jamais: Pourquoi?
En général, c'est qu'il y a une boucle infinie (par exemple, la
condition de fin de boucle ne se produit pas). Une des possibilités qui
me viennent à l'esprit est que tu travailles sur deux threads avec des
variables portant le même nom, et que tu t'attends en modifiant l'une à
voir l'autre se modifier.
Pour sortir d'une boucle tu n'as pas 36 possibilités:
+ la condition de sortie se produit (normal)
+ un appel Exit pour sortir proprement avant que la condition soit réalisée
+ un appel Goto vers un label en dehors de la boucle (beurk, mais
parfois utile si on sait ce qu'on fait)

Ce dont j'ai peur, c'est que la parade que tu as trouvé consiste en
l'appel de la procédure maitresse, en utilisant la variable publique
pour savoir que tu reviens de la procédure du module. Et ca, c'est très
dangereux, parce que ça veux dire que tu vas empiler les appels et finir
par cracher l'appli, faute de mémoire.

Vincent Guichard
Avatar
LE TROLL
Déjà ton compteur faudrait l'initialiser !

Et la sortie d'une procédure ce n'est pas "End" mais "Exit Sub", sauf
évènement de fin de programme, ce qui est un autre sujet (pour le "end").
if compteur = n then : exit sub

Là, a priori, le compteur il n'avance qu'une fois, il n'est pas bouclé, et
si ta variable est réinitialisée à chaque appel ? Il manque du code...

In fine, rien ne te dis quand ton compteur remplit la condition, à part la
fermeture du programme, drôle de façon...

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"fraction" a écrit dans le message de
news:
On 23 déc, 17:35, Vincent Guichard wrote:
Le 23/12/2009 15:35, fraction a écrit :







>> Je ne comprends pas le problème. Qu'entends-tu par "appeler un module"?
>> En général, on appelle une fonction d'un module, pas le module
>> lui-même.
>> Et le retour d'un fonction est automatique (sauf si la fonction
>> contient
>> une boucle infinie).
>> Peux-tu donner un exemple de code?

>> Vincent Guichard

> Oui, tu as raison. J'appelle une procédure d'un module, elle-même
> appelle d'autres procédures de ce même module. Mais une fois cette
> exécution terminée, elle ne renvoie pas la main. Le code est trop
> compliqué pour l'écrire ici.
> J'ai peut-être fait une erreur.
> Ça m'arrive rarement. Et j'ai trouvé la parade en déclarant une
> variable publique et en demandant à la procédure fille de revenir en
> arrière.

Comment donc peux-tu demander à la procédure fille de revenir en
arrière? Et comment une variable publique peut-elle bien corriger un
problème tel que tu le décris? Je subodore un grave problème de
conception de l'application. Faute du code complet, peut être
pourrais-tu indiquer une pile des appels? Et donner la "parade" que tu
as trouvé?

Voici les choses telles que je les comprends, avec les informations
limitées que j'ai. Tu appeles une fonction (ou une procédure) qui se
trouves dans ton module. Cette fonction ne retourne jamais: Pourquoi?
En général, c'est qu'il y a une boucle infinie (par exemple, la
condition de fin de boucle ne se produit pas). Une des possibilités qui
me viennent à l'esprit est que tu travailles sur deux threads avec des
variables portant le même nom, et que tu t'attends en modifiant l'une à
voir l'autre se modifier.
Pour sortir d'une boucle tu n'as pas 36 possibilités:
+ la condition de sortie se produit (normal)
+ un appel Exit pour sortir proprement avant que la condition soit
réalisée
+ un appel Goto vers un label en dehors de la boucle (beurk, mais
parfois utile si on sait ce qu'on fait)

Ce dont j'ai peur, c'est que la parade que tu as trouvé consiste en
l'appel de la procédure maitresse, en utilisant la variable publique
pour savoir que tu reviens de la procédure du module. Et ca, c'est très
dangereux, parce que ça veux dire que tu vas empiler les appels et finir
par cracher l'appli, faute de mémoire.

Vincent Guichard



Par exemple, mon module volonté doit déduire les propriétés de n
combinaisons :

public compteur as integer

module volonté :
public sub simulation()
compteur=compteur+1
déduction.exécution(compteur)
if compteur=n then
end
endif
end sub

module déduction :
public sub exécution(x)
blablabla
volonté.simulation
end sub
Avatar
LE TROLL
C'est plus explicit de mettre Call quand on appelle quelque chose, ça évite
les quiproquos...

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"fraction" a écrit dans le message de
news:
On 23 déc, 17:50, fraction wrote:
On 23 déc, 17:35, Vincent Guichard wrote:





> Le 23/12/2009 15:35, fraction a écrit :

> >> Je ne comprends pas le problème. Qu'entends-tu par "appeler un
> >> module"?
> >> En général, on appelle une fonction d'un module, pas le module
> >> lui-même.
> >> Et le retour d'un fonction est automatique (sauf si la fonction
> >> contient
> >> une boucle infinie).
> >> Peux-tu donner un exemple de code?

> >> Vincent Guichard

> > Oui, tu as raison. J'appelle une procédure d'un module, elle-même
> > appelle d'autres procédures de ce même module. Mais une fois cette
> > exécution terminée, elle ne renvoie pas la main. Le code est trop
> > compliqué pour l'écrire ici.
> > J'ai peut-être fait une erreur.
> > Ça m'arrive rarement. Et j'ai trouvé la parade en déclarant une
> > variable publique et en demandant à la procédure fille de revenir en
> > arrière.

> Comment donc peux-tu demander à la procédure fille de revenir en
> arrière? Et comment une variable publique peut-elle bien corriger un
> problème tel que tu le décris? Je subodore un grave problème de
> conception de l'application. Faute du code complet, peut être
> pourrais-tu indiquer une pile des appels? Et donner la "parade" que tu
> as trouvé?

> Voici les choses telles que je les comprends, avec les informations
> limitées que j'ai. Tu appeles une fonction (ou une procédure) qui se
> trouves dans ton module. Cette fonction ne retourne jamais: Pourquoi?
> En général, c'est qu'il y a une boucle infinie (par exemple, la
> condition de fin de boucle ne se produit pas). Une des possibilités qui
> me viennent à l'esprit est que tu travailles sur deux threads avec des
> variables portant le même nom, et que tu t'attends en modifiant l'une à
> voir l'autre se modifier.
> Pour sortir d'une boucle tu n'as pas 36 possibilités:
> + la condition de sortie se produit (normal)
> + un appel Exit pour sortir proprement avant que la condition soit
> réalisée
> + un appel Goto vers un label en dehors de la boucle (beurk, mais
> parfois utile si on sait ce qu'on fait)

> Ce dont j'ai peur, c'est que la parade que tu as trouvé consiste en
> l'appel de la procédure maitresse, en utilisant la variable publique
> pour savoir que tu reviens de la procédure du module. Et ca, c'est très
> dangereux, parce que ça veux dire que tu vas empiler les appels et finir
> par cracher l'appli, faute de mémoire.

> Vincent Guichard

Par exemple, mon module volonté doit déduire les propriétés de n
combinaisons :

public compteur as integer

module volonté :
public sub simulation()
compteur=compteur+1
déduction.exécution(compteur)
if compteur=n then
end
endif
end sub

module déduction :
public sub exécution(x)
blablabla
volonté.simulation
end sub



Sauf que là, j'ai mis la condition de sortie après.
Avatar
LE TROLL
Et paf ! Merci mon chien !

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"fraction" a écrit dans le message de
news:
On 23 déc, 18:23, Vincent Guichard wrote:
Le 23/12/2009 17:52, fraction a écrit :





>> Par exemple, mon module volonté doit déduire les propriétés de n
>> combinaisons :

>> public compteur as integer

>> module volonté :
>> public sub simulation()
>> compteur=compteur+1
>> déduction.exécution(compteur)
>> if compteur=n then
>> end
>> endif
>> end sub

>> module déduction :
>> public sub exécution(x)
>> blablabla
>> volonté.simulation
>> end sub

> Sauf que là, j'ai mis la condition de sortie après.

Si j'analyse bien ton code, il va empiler les appels à exectution et à
simulation de façon infinie (la condition de terminaison (end) n'arrive
jamais puisque tu appelles TOUJOURS execution avant, relancant par la
même une nouvelle instance de simulation). Tu va finir par exploser la
pile d'appel (si cela n'explose pas avant autre part).
Par ailleurs, End quitte le programme, pas la procédure (pour quitter la
procédure c'est Exit Sub).
Ensuite, si tu modifie x dans le blablabla d'execution, vérifie que x
est passé par référence si tu veux que compteur soit modifié (sinon la
modification restera locale à cette instance de execution).
Enfin, Si tu dois vraiment utiliser un compteur et que celui-ci n'est
accédé directement que dans simulation, utilise de préférence une
variable statique propre à la procédure (voir mot clef static) qui sera
donc commune à toute les instances de simulation, plutôt qu'une variable
publique.

Sur ce, je pars en vacances jusqu'au 04/01

Bonnes fêtes à tous,

Vincent Guichard



J'ai dit que j'avais mis la condition de sortie trop tôt dans mon
exemple. En tout cas ça marche bien comme ça.
Bonnes fêtes et bonnes vacances à toi.
Avatar
Driss HANIB
Salut Fraction

Ok pour cela , je n'avais pas vu que tu étais sur Excel;
Ceci dit tout le reste avant tient toujours.

Driss

"fraction" a écrit dans le message de news:

On 23 déc, 17:06, "Driss HANIB" wrote:
Salut Fraction

OK pour cela.
Regarde quand même tout de suite si tu peux comiler ton projet.
Cela serait dommage que tu avance de plus en plus dans ta parade et que tu
sois bloqué à la compilation.

Driss



Je programme à partir d'Excel. Je n'ai pas à compiler, enfin je crois.
Avatar
Driss HANIB
Salut Fraction

Je vais dans le même sens que Vincent il y a un problème car chaque
procédure appelle l'autre. Et effectivement sur cette base là c'est ta
condition sur le compteur que "te sauve"..

tu pourrais écrire quelque chose de ce type là

Public Sub Simulation

compteur = compteur +1
while compteur < n
déduction.exécution(compteur)
compteur = compteur+1
wend

end sub

public sub exécution(x)
blablabla
end sub

A partir de cela tu n'auras plus de problèmes. A la fin de l'exécution de
"Exécution" cela revient directement dans simulation.
Compteur s'incrémente et si il est inférieur à n, exécution est de b=nouveau
appelé.
S'il atteint n la boucle s'arrête et la fonction Simulation aussi.

Effectivement si tu avais du compiler ta "formulation" aurait bloqué : deux
procédure/fonctions ne doivent pas s'appeler l'une l'autre.
Tu aurais eu ce dont a parlé Vincent.

Driss


"fraction" a écrit dans le message de news:

On 23 déc, 18:23, Vincent Guichard wrote:
Le 23/12/2009 17:52, fraction a écrit :





>> Par exemple, mon module volonté doit déduire les propriétés de n
>> combinaisons :

>> public compteur as integer

>> module volonté :
>> public sub simulation()
>> compteur=compteur+1
>> déduction.exécution(compteur)
>> if compteur=n then
>> end
>> endif
>> end sub

>> module déduction :
>> public sub exécution(x)
>> blablabla
>> volonté.simulation
>> end sub

> Sauf que là, j'ai mis la condition de sortie après.

Si j'analyse bien ton code, il va empiler les appels à exectution et à
simulation de façon infinie (la condition de terminaison (end) n'arrive
jamais puisque tu appelles TOUJOURS execution avant, relancant par la
même une nouvelle instance de simulation). Tu va finir par exploser la
pile d'appel (si cela n'explose pas avant autre part).
Par ailleurs, End quitte le programme, pas la procédure (pour quitter la
procédure c'est Exit Sub).
Ensuite, si tu modifie x dans le blablabla d'execution, vérifie que x
est passé par référence si tu veux que compteur soit modifié (sinon la
modification restera locale à cette instance de execution).
Enfin, Si tu dois vraiment utiliser un compteur et que celui-ci n'est
accédé directement que dans simulation, utilise de préférence une
variable statique propre à la procédure (voir mot clef static) qui sera
donc commune à toute les instances de simulation, plutôt qu'une variable
publique.

Sur ce, je pars en vacances jusqu'au 04/01

Bonnes fêtes à tous,

Vincent Guichard



J'ai dit que j'avais mis la condition de sortie trop tôt dans mon
exemple. En tout cas ça marche bien comme ça.
Bonnes fêtes et bonnes vacances à toi.
1 2