Perl TK : problèmes passage arguments [Résolu/Fermé]

Signaler
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021
-
Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
-
Salut,
Voilà j'ai un problème de passage d'arguments dans un très gros programme Perl TK. Mais pour expliquer mon problème je vais le réduire à l'exemple suivant et je m'excuse d'avance pour les erreurs possibles de syntaxe dans ce qui suit, c'est surtout pour fixer les idées.
Je m'explique:
#J'ai une variable globale
my $compteurBouton = 0;
#qui s'incrémente quand...je clique sur un bouton.
my $btn1 = $mw->Button(-text => "Count", -command => [\&sub_count{$compteurBouton ++;});

my $btn2 = $mw->Button(-text => "checkCount", -command => [\&sub_checkCount, $compteurBouton]);
#Je passe en paramètre $compteurBouton à sub_count.

sub sub_checkCount()
{
my ($p_compteurBouton) = @_;
print("p_compteurBouton = $p_compteurBouton\n");
}

==> Problème: $p_compteurBouton = 0 quelque soit le nombre de click

QUESTION: comment faire pour que soit pris en compte le contenu de $compteurBouton qui a bien été modifiée en cliquant sur btn1, dans la fonction sub_checkCount qui consomme cette variable (globale) en paramètre?

Merci d'avance pour l'aide: je suis complètement bloqué :-(

1 réponse

Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
Salut,

Le problème c'est que ton code comporte des incohérences, et je ne sais pas si c'est parce que tu as fait un code illustratif approximatif ou si c'est effectivement la cause de ton (tes) problème(s).

Tout d'abord, si ta variable est globale à ton script, tu n'as pas à la passer en paramètre d'une fonction.

Par ailleurs, en faisant :

my $btn2 = $mw->Button(-text => "checkCount", -command => [\&sub_checkCount, $compteurBouton]); 

à l'initialisation de ton objet Button (qui ne se fait qu'une fois), tu dis à Perl/Tk que tu veux, lorsque le bouton est pressé, appeler la fonction sub_checkCount() avec $compteurBouton, qui est évalué à cet instant, et vaut 0 puisque tu es au stade de l'initialisation.

Je ne pense pas que tu aies besoin d'un paramètre.

Si tu veux vraiment un paramètre (c'est probablement que tu n'as pas besoin d'une variable globale), dans ce cas, tu dois probablement passer une référence à la variable $compteurBouton lorsque tu crées ton bouton Perl/Tk, et non le contenu de la variable elle même, de la même façon que tu passes une référence à la fonction...

Tu ferais cela en faisant :

my $btn2 = $mw->Button(-text => "checkCount", -command => [\&sub_checkCount, \$compteurBouton]); 

et dans ta fonction du récupères ton paramètre en déréférençant la référence passé, comme ceci :

my $p_compteurBouton = ${$_[0]}

Dal

N.B. : code non testé
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021

C'est exactement ça!! ça marche !! Merci beaucoup Dal pour ton explication :)
Il faut que j'essaye de comprendre ce que ça veut dire "référencement/déréférencement". Je dois avouer que je ne comprends pas bien cette notion, même si ça résout mon bug. Je vais essayer d'étudier ça.
Merci en tt cas pour ton aide DAL
Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
De rien, content que cela résolve ton problème.

En Perl, une référence fonctionne un peu comme un pointeur en C.

Tu as un tutoriel officiel Perl dessus, assez accessible :

https://perldoc.perl.org/perlreftut

et la doc complète (probablement "trop" car assez complexe, il vaut mieux lire le tutoriel avant) :

https://perldoc.perl.org/perlref


Dal
Messages postés
33
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
4 avril 2021

Merci Dal, j'ai également trouvé ce tuto bien fait (pour ceux que ça intéresse) sur le sujet:
https://formation-perl.fr/guide-perl-09.html
Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
Oui Sylvain Lhullier est épatant :-)

Comme tu le vois le déréférencement se fait normalement avec
$$
.

Cependant, dans le cas d'une référence contenue à un indice d'un tableau (par exemple
$_[0]
pour le premier paramètre passé à une fonction), il nécessite pour une évaluation correcte soit :

- de mettre entre accolades la référence (comme proposé dans ma syntaxe), ainsi :
${$_[0]}
, ou

- d'utiliser le raccourci de notation :
$_->[0]
qui est équivalent, et plus lisible pour certains

Ces deux façons de faire sont expliquées à https://perldoc.perl.org/perlreftut#Using-References ("Use Rule 1" et "Use Rule 2").

Sylvain utilise seulement la 2ème sur cette page, mais cela signifie la même chose.


Dal