IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Perl Discussion :

[Perl Tk] Taille d'un tableau renvoyé.


Sujet :

Interfaces Graphiques Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Par défaut [Perl Tk] Taille d'un tableau renvoyé.
    Bonjour.

    Je rencontre le problème dans Perl Tk, mais c'est peut-être plus général.
    La méthode tagRanges("sel") du widget Text renvoie une liste (autrement dit un tableau, à moins qu'il n'y ait entre les listes et les tableaux une différence qui m'échappe) d'indices.

    J'aurais besoin de connaître la taille de ce tableau. (Cette taille est égale au double du nombre des parties séparées du texte qui sont sélectionnées).

    Pour connaître la taille d'un tableau nommé, par exemple @tableau, Holzner, p. 88, donne 4 façons :

    1° $#tableau + 1 (renvoie la taille du tableau);
    2° scalar(@tableau) (renvoie la taille du tableau);
    3° @tableau + 0 (renvoie la taille du tableau);
    4° my $taille = @tableau (met dans $taille la taille du tableau)

    Il me semble évident que 1° ne peut pas être étendu à un tableau non nommé.

    J'ai essayé d'imiter 2° de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $monWidgetTexte->messageBox( -message => scalar($monWidgetTexte->tagRanges("sel") ))
    mais le résultat est incorrect : c'est le tableau lui-même qui s'affiche, et non sa taille.

    Si on essaie d'imiter 3° de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $monWidgetTexte->messageBox( -message => $monWidgetTexte->tagRanges("sel") + 0)
    c'est un nombre qui s'affiche, mais pas le bon.

    Ce qui m'étonne vraiment, c'est que l'application de 4° que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $taille = $monWidgetTexte->tagRanges("sel");
    $monWidgetTexte->messageBox( -message => $taille);
    ne fonctionne pas non plus comme souhaité : cela n'affiche pas la taille, mais tout le tableau.

    Finalement, la seule méthode correcte que j'aie trouvée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @liste = $monWidgetTexte->tagRanges("sel");
    $monWidgetTexte->messageBox( -message => scalar(@liste) );
    Pourtant, cette méthode ne me satisfait pas, parce que je supose que la première des deux instructions provoque une copie du tableau (ou de la liste), qui risque d'être volumineux.

    Quelqu'un voit-il une meilleure méthode ?

    Merci d'avance.
    M.

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Mersenne
    Finalement, la seule méthode correcte que j'aie trouvée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @liste = $monWidgetTexte->tagRanges("sel");
    $monWidgetTexte->messageBox( -message => scalar(@liste) );
    Pourtant, cette méthode ne me satisfait pas, parce que je supose que la première des deux instructions provoque une copie du tableau (ou de la liste), qui risque d'être volumineux.

    Quelqu'un voit-il une meilleure méthode ?

    Merci d'avance.
    M.
    Je ne pense pas que le tableau risque d'être si volumineux que ça... Après tout il est rare qu'on sélectionne plusieurs parties d'un même texte (je ne sais même pas comment tu fais...).
    Si tu as vraiment besoin d'une solution plus efficiente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $monWidgetTexte->messageBox( -message => scalar(()=$monWidgetTexte->tagRanges("sel")));
    En effet le problème vient de ce que la description de tagRanges() est légèrement mensongère : en contexte de liste, tagRanges() renvoie bien la liste décrite, mais en contexte scalaire, elle renvoie une référence sur la liste décrite et non une liste (qui en contexte scalaire est équivalente à sa longueur). On utilise donc le "()=" pour mettre la fonction en contexte de liste (sans faire de recopie donc sans gaspillage de ressource), puis l'un des trucs précédent pour mettre en contexte scalaire l'ensemble de l'expression, obtenant ainsi le résultat désiré.

    --
    Jedaï

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Par défaut
    Citation Envoyé par Jedai
    Je ne pense pas que le tableau risque d'être si volumineux que ça... Après tout il est rare qu'on sélectionne plusieurs parties d'un même texte (je ne sais même pas comment tu fais...).
    Sur un widget Text qui contient plusieurs fois le caractère "a" avec d'autres caractères entre les occurrences de "a", utiliser le menu contextuel pour demander un "find all" du caractère "a".

    Si tu as vraiment besoin d'une solution plus efficiente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $monWidgetTexte->messageBox( -message => scalar(()=$monWidgetTexte->tagRanges("sel")));
    En effet le problème vient de ce que la description de tagRanges() est légèrement mensongère : en contexte de liste, tagRanges() renvoie bien la liste décrite, mais en contexte scalaire, elle renvoie une référence sur la liste décrite et non une liste (qui en contexte scalaire est équivalente à sa longueur). On utilise donc le "()=" pour mettre la fonction en contexte de liste (sans faire de recopie donc sans gaspillage de ressource), puis l'un des trucs précédent pour mettre en contexte scalaire l'ensemble de l'expression, obtenant ainsi le résultat désiré.
    Merci. J'imagine qu'on trouve ça dans la documentation. Je devrais peut-être m'y plonger avant d'interroger les autres, mais bon, quand quelque chose n'est pas conforme à ce que disent les livres, j'ai peur de remuer ciel et terre alors qu'il y a sur developpez.net des gens qui ne demandent qu'à se rendre utiles.
    Encore merci.
    M.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération de la taille d'un tableau en perl
    Par Info_76 dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2008, 15h21
  2. Récupérer la taille d'un tableau en perl
    Par Info_76 dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2008, 14h47
  3. taille d'un tableau
    Par monstour dans le forum ASP
    Réponses: 3
    Dernier message: 24/06/2004, 15h16
  4. Taille maximum de tableau en Delphi
    Par yannick37 dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2004, 13h18
  5. qbasic : taille d'un tableau
    Par clood200 dans le forum Basic
    Réponses: 2
    Dernier message: 16/09/2003, 07h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo