| sub rappelé avant sa fin | |
|
|
Auteur | Message |
---|
Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: sub rappelé avant sa fin Dim 16 Oct 2016 - 15:15 | |
| Voilà mon souci. J' ai une procédure dont je ne peux quantifier le temps d' exécution (Message écrit + vocal) et qui est appelé plusieurs fois dans le même programme. Il arrive que cette procédure soit rappelé avant sa propre fin. Cela provoque une erreur de variable déjà déclarée. Quelqu' un aurait il une solution ? Jack, tu n' aurais pas une commande WAIT VAR%=0 en stock.le programme attend que la variable VAR% soit égale à 0 ou 1 (peu importe) pour continuer. | |
|
| |
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 15:55 | |
| Deux solutions: 1. dans la sub, tu fais - Code:
-
if variable("nom_de_la_variable_en_conflit")=1 ... ici, la procédure est déjà en cours ! exit_sub end_if dim_local nom_de_la_variable_en_conflit 2. tu déclares une variable globale du type ma_sub_difficile%. En entrant dans la sub en question, tu vérifies qu'elle est à zéro. Si oui, tu la mets à 1 et tu continues, et tu la mets à zéro en sortant. Si par contre, elle est à 1, tu sors immédiatement. Les deux solutions sont équivalentes, mais la première est plus "propre". | |
|
| |
papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 16:17 | |
| - ygeronimi a écrit:
- J' ai une procédure dont je ne peux quantifier le temps d' exécution (Message écrit + vocal)
et qui est appelé plusieurs fois dans le même programme. Il arrive que cette procédure soit rappelé avant sa propre fin. Cela provoque une erreur de variable déjà déclarée. Comment peut-on rappeler une sub avant sa propre fin ?! A part un appel récursif (que panoramic ne permet pas dans tous les cas), je ne vois pas comment une SUB qui est en cours d’exécution puisse être rappelée avant sa propre fin ! Je soupçonne le code qui ,lui, n’est pas propre. Mais, tu as peut-être raison là où j’ai tort. Tu n’aurais pas un bout de code en stock pour illustrer ça ? | |
|
| |
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 16:36 | |
| - Citation :
- Comment peut-on rappeler une sub avant sa propre fin ?!
C'est simple. Il suffit que la sub en question soit appelée par une routine évènement (un timer, un on_click etc). Ce sont des choses qui arrivent. EDIT Un exemple très simple pour le provoquer: - Code:
-
label clic
button 1 : top 1,10 : left 1,10 : caption 1,"Cliquer ici" : on_click 1,clic
end
clic: essai() return
sub essai() dim_local test, i% for i%=1 to 300 wait 2 next i% end_sub
Clique 2 fois sur le bouton, et boum!!!! Voici la version corrigée: - Code:
-
label clic
button 1 : top 1,10 : left 1,10 : caption 1,"Cliquer ici" : on_click 1,clic
end
clic: if variable("test")=1 then return essai() return
sub essai() dim_local test, i% for i%=1 to 300 wait 2 next i% end_sub | |
|
| |
silverman
Nombre de messages : 968 Age : 51 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 17:53 | |
| @klaus Il vaut mieux utiliser une variable globale car plusieurs subs différentes peuvent être appelées dans la procédure évenement @ygeronimi C'est amusant, tu as posté la solution à ton problème sans le savoir! Avec l'ex. de klaus: - Code:
-
label clic
dim CURRENT_EVENT_clic% dim c%
button 1 : top 1,10 : left 1,100 : caption 1,"Cliquer ici" : on_click 1,clic
end
clic: if CURRENT_EVENT_clic%=1 then return CURRENT_EVENT_clic%=1
c%=c%+1 : caption 0,"evenement applé "+str$(c%)+" fois" essai()
CURRENT_EVENT_clic%=0 return
sub essai() dim_local test, i% for i%=1 to 30 wait 2 next i% end_sub
| |
|
| |
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 18:11 | |
| - Citation :
- Il vaut mieux utiliser une variable globale car plusieurs subs différentes peuvent être appelées dans la procédure évenement
Fort juste, Silverman. | |
|
| |
papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 18:25 | |
| J’ai écrit ci-haut - Citation :
- Je soupçonne le code qui, lui, n’est pas propre.
Justement le code de l’exemple donné par Klaus n’est pas « propre » (pardon Klaus) J'admets que c'est un exemple de code pour montrer le problème, mais le codeur doit prendre les mésures nécessaires pour présenter un code sans faille (ou presque). Personnellement je le code ainsi - Code:
-
label clic button 1 : top 1,10 : left 1,10 : caption 1,"Cliquer ici" : on_click 1,clic end
clic: essai() return
sub essai() dim_local test, i% inactive 1 : ' < --- inhiber le bouton for i%=1 to 300 wait 2 next i% active 1 : ' < --- rétablir le bouton end_sub
… et plus de problème ! | |
|
| |
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 18:35 | |
| Bien sûr, cela supprime le conflit dans mon exemple restreint.
Mais relis l'énoncé initial de Ygeronimi. Il a une sub qui affiche un message et diffuse une annonce vocale. J'imagine que c'est typiquement le cas d'une sub auxiliaire qui peut être appelée n'importe où, pour réagir aux actions de l'utilisateur (message d'erreur dans un jeu pour action invalide etc), annonce de points gagnés lors du passage d'un personnage de jeu sur en endroit précis, et j'en passe.
Dans tous ces cas, l'annonce peut être déclenchée par des évènements très divers et pas seulement le clic sur un bouton, mais découler plutôt du contexte général du jeu. Et c'est pourquoi j'ai focalisé la solution sur le test de la présence de la variable sans considérer ce qui a déclenché l'action. | |
|
| |
papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: sub rappelé avant sa fin Dim 16 Oct 2016 - 18:42 | |
| Vu sous cet angle, c’est plus clair ! C'est aussi plus "propre". | |
|
| |
Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 17 Oct 2016 - 11:06 | |
| La procédure rappelé est celle ci : - Code:
-
sub FCT_SelectMessage(M%) dim_local i%,mes$ i%=M% select i% case 1 : mes$="Joueur 1, distribue." case 2 : mes$="Joueur 2, distribue." case 3 : mes$="Joueur 1, joue." case 4 : mes$="Joueur 2, joue." case 5 : mes$="Joueur 1, gagne." case 6 : mes$="Joueur 2, gagne." case 7 : mes$="Bataille !" case 8 : mes$="Joueur 1, a Gagné !" case 9 : mes$="Joueur 2, a Gagné !" end_select if M%<7 caption alph0%(5),mes$ pause 1000 else caption alph0%(0),mes$ left alph0%(0),(width(pan%(3))-width(alph0%(0)))/2 pause 1000 end_if if Son%=1 FCT_Parler(mes$) pause 2000 end_if end_sub lorsque un joueur clique sur une pile de cartes. L' erreur se produit sur la ligne de déclaration des variables locales. Si je peux finir par trouver un temps de pause pour l' affichage écrit, il n' est pas simple de chronométrer le temps du message parlé. Je vais étudier vos solutions de près, très près... | |
|
| |
Contenu sponsorisé
| Sujet: Re: sub rappelé avant sa fin | |
| |
|
| |
| sub rappelé avant sa fin | |
|