Perl TK : problèmes passage arguments

Résolu/Fermé
JamieMacUloth
Messages postés
47
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
6 juin 2022
- 26 févr. 2017 à 14:07
[Dal]
Messages postés
5912
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2022
- 3 mars 2017 à 11:00
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

[Dal]
Messages postés
5912
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2022
1 014
Modifié par [Dal] le 2/03/2017 à 10:26
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é
0
JamieMacUloth
Messages postés
47
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
6 juin 2022

2 mars 2017 à 10:36
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
0
[Dal]
Messages postés
5912
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2022
1 014
2 mars 2017 à 11:41
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
0
JamieMacUloth
Messages postés
47
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
6 juin 2022

3 mars 2017 à 10:13
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
0
[Dal]
Messages postés
5912
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2022
1 014
Modifié par [Dal] le 3/03/2017 à 11:01
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
0