Gambas France BETA


Pas de compte ? Incription

A propos de Return

1
AuteurMessages
Foromus#1 Posté le 17/5/2016 à 09:59:58
Bonjour à tous,

Voilà un point qui me tracasse...
Voici un code tout simple :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PRIVATE SUB MaProcedure()

Action 1
Action 2
IF Condition1 = Vraie THEN
Action 3
Appel_Procedure_Autre
RETURN
ENDIF
IF Condition2 = Vraie THEN
Action 4
Action 5
ENDIF
IF Condition3 = Vraie THEN ActionAutre
Action 6
Action 7
TimerSouris.Enabled = TRUE
Machin.SetFocus
END


J'ai suivi pas-à-pas, les choses se passent normalement.
Puis à un moment, la condition1 (ligne 5 ) devient vraie, les instructions suivantes sont donc exécutées. Après appel "Procédure_Autre" (ligne 7 ) , on revient à "Return" (ligne 8 ) , et là, qu'est-ce qui se passe ?
Normalement, je pensais que la suite sautait directement à "End" (ligne 19 ), soit la fin de la procédure, mais non, pas du tout, ça saute à "Action6" (ligne 15 ) ! Puis "Action7", puis "TimerSouris", puis "Machin.SetFocus", et enfin, ça se termine. Au passage, notez que le TimerSouris est la seule solution de contournement trouvée, pour atténuer le mauvais effet du curseur qui s'en va en haut de la feuille au démarrage du formulaire (j'ai déjà fait part de ce problème, il n'est toujours pas résolu).
Donc, là, je suis un peu surpris, je pensais que, après "Return" (ligne 8 ) , on sortait purement et simplement de la procédure, mais il semblerait que non...
Un avis ?
Bon, j'ai là aussi, contourné le truc, je demande, c'est juste pour savoir...
Merci à vous !
didier18#2 Posté le 17/5/2016 à 11:24:34
Bonjour Foromus

Que font 'Action 3' et 'Appel_Procedure_Autre' ?
N'y aurait-il pas un nouveau rappel de test sur 'MaProcedure()' qui traîne ?
Ou dans intervalle du test de 'IF Condition1 = Vraie THEN' la 'IF Condition3 = Vraie THEN ActionAutre' deviendrait vraie ?...
Normalement le "Return" (ligne 8 ) te fait ressortir de la procédure en cours, et retourne dans la procédure 'appelante', mais si dans l'appelante (plus loin dans le code) tu re-test MaProcedure() et que 'Condition3 = Vraie' alors tu te retrouve bien sur ligne 15 et suivantes...

Bonne journée.
Foromus#3 Posté le 17/5/2016 à 21:17:49
Bonsoir Didier18,

Bon, c'est vrai que c'est un peu compliqué...
Que font 'Action 3' et 'Appel_Procedure_Autre' ?

Action3 efface des trucs, Procedure_Autre va continuer le programme pour appeler un autre formulaire.
En fait, j'ai fait une erreur sur la ligne 14, j'aurai du écrire :
IF Condition3 = Vraie THEN MaProcedure
Car celle-ci peut s'auto- appeler, et après examen, il se trouve que "MaProcedure" est, dans le cas qui m'occupe, déjà appelée depuis un timer. Et bien que celui-ci soit arrêté avant l'appel, le programme y retourne pour rencontrer le End.
Donc, je ne suis pas trop étonné du retour dans MaProcedure, ce qui me choque, c'est le saut à la ligne 15, alors que toutes les précédentes, depuis Return, sont bien ignorées. Et non, la condition3 est toujours fausse, donc, ce n'est pas de ce côté que ça se passe.
Maintenant, il est possible que le premier appel de MaProcédure ne soit pas terminé, et donc, pour que celle-ci soit définitivement soldée, il faut y revenir, je suppose que toute entrée dans une procédure, se conclut obligatoirement par un passage sur End.
Je reste sur cette explication qui me paraît la plus probable, après, mettre un point d'arrêt au premier appel et tout faire pas-à-pas, ça va me prendre une semaine, le jeu n'en vaut pas la chandelle...
Mais je reconnais que je n'avais pas pensé à chercher de cette façon ! Merci pour l'aiguillage !
spheris#4 Posté le 17/5/2016 à 22:23:06
RETURN, ce n'est pas simplement pour récupérer une valeur d'une variable de la fonction?

exemple :

1
2
3
DIM a AS INTEGER
a = a+2
RETURN a

Je ne le vois pas comme une porte de sortie pour une fonction. Peut être me trompe je...
;)

didier18#5 Posté le 17/5/2016 à 22:47:21
C'est aussi vrai spheris ;-), mais je ne voulais pas 'embrouiller' le sujet...
Le plus simple et pour être complet, voici ce que dit l'aide (qui est très bien conçue(merci aux rédacteurs)).

"Quitte une procédure ou une fonction en retournant la valeur d'Expression.
Si vous retournez d'une procédure, alors vous ne pouvez spécifier aucune expression.
Si vous retournez d'une fonction, et qu'Expression n'est pas spécifié, alors la valeur retournée sera la valeur par défaut associée au type de la donnée."

Cela devrait aider à résoudre le problème.
Patrick#6 Posté le 18/5/2016 à 07:46:48
Êtes vous entrain de sous entendre que return n'est pas une "bonne" solution pour quitter une procédure ?
Foromus#7 Posté le 18/5/2016 à 08:25:59
Bonjour à tous,

Bien entendu que "Return" sert à autre chose qu'à sortir d'une procédure. Et aussi d'une fonction, où, là, il retourne bien une valeur !
A première vue, il n'y a guère d'autre solution pour sortir d'une procédure dès lors que, à partir d'un événement donné, on doit ignorer le reste du code. Contrairement au Basic d'antan, on ne dispose, ni d'un GoTo, ni d'un GoSub, commandes du reste copieusement méprisées par tout ceux qui maîtrisaient le sujet ! Et pourtant, dans une vie antérieure, que ce soit sur mon ZX ou mon Apple, j'en ai utilisé des tas quand même, et ça fonctionnait...
Pour revenir à mon sujet, je crois que je ne sais pas exactement combien de fois la procédure est appelée, ce qui fait que je ne sais pas combien de fois le programme en sortira...
Bon, mais ça marche, c'était surtout une curiosité, et au moins, ça m'a obligé à réfléchir, même avec un peu d'aide !
Par contre, et sans vouloir insister, le coup du pointeur de souris que s'en va dans le tableau de bord à l'open de la procédure - et que pour celle-là, ça me gêne un peu, même si ce n'est pas très grave. J'avais déjà posté sur le sujet, avec un exemple dans la Forge, je n'ai jamais eu de solution.
Merci à tous pour votre participation !
didier18#8 Posté le 18/5/2016 à 10:01:57
Contrairement au Basic d'antan, on ne dispose, ni d'un GoTo, ni d'un GoSub,

Goto et gosub existent toujours dans le code gambas, je ne pense pas qu'il s'agisse de 'mépris' quand à leur non utilisation mais plutôt d'une question de praticité.
je ne sais pas exactement combien de fois la procédure est appelée, ce qui fait que je ne sais pas combien de fois le programme en sortira...

Pourquoi ne mettrais tu pas un compteur pour ta procédure du genre :
1
2
' Gambas class file
PUBLIC $iNba AS INTEGER 'Nombre d'accès

Puis en entrée de ta procédure...
1
2
3
4
5
PUBLIC SUB Ma_Procedure()
INC $iNba 'incrémente $iNba
PRINT "$iNba = " & $iNba 'affiche le nombre d'accès

END

Cela t'affichera dans la console le nombre d'accès à Ma_Procedure()...
spheris#9 Posté le 18/5/2016 à 22:25:10
http://gambaslinux.fr/articles.php?lng=fr&pg=669

;)
spheris#10 Posté le 23/5/2016 à 21:27:27
C'est curieux ce que tu enonces là Foromus, car le return me fait bien sortir de la methode/fonction.
Peut être as-tu une deuxième condition IF vérifiée?
Affaire à suivre.
;)
1