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

Langage Perl Discussion :

[langage] passage de paramètres à une fonction


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 104
    Points : 49
    Points
    49
    Par défaut [langage] passage de paramètres à une fonction
    salut,

    je ne comprends plus rien à la programmation depuis que je viens de me mettre à Perl.

    J'ai une méthode dans un module "Periode.pm" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    sub calculPeriode
     
      {
      	my ($fichierIn,$chrSize,@fact,$tailleTab,%hashFT) = @_;
            # Test de mes valeurs de paramètres
    	print $fichierIn;  #OK
    	print $chrSize;    #OK
    	my $res = $hashFT{Crp};   #Pas OK !
    	print "$res\n";
    	print "Taille : $tailleTab\n";   # Pas OK
            print "@fact ";       # Tableau incohérent
      }
    Dans mon module principal (avec "use Periode;"), j'appelle cette fonction de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Periode::calculPeriode($fichier,$sizeChr,@ft,$t,%hashFactors);
    A ce moment chacun des paramètres possède bien des valeurs correctes mais les tests dans le bloc de la fonction révèlent que les 2 premiers sont bons mais pas les 3 suivants :
    le tableau contient des valeurs supplémentaires (tableau contenant les données sélectionnées dans une List avec Perl Gtk) tandis que les 2 autres ne sont pas initialisés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Use of uninitialized value in concatenation (.) or string at Periode.pm ...
    Donc what is the problem !
    Pour les autres fonctions provenant d'autres modules, je n'ai pas de pbm

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Je vois un problème dans les arguments que tu donnes à ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($fichierIn,$chrSize,@fact,$tailleTab,%hashFT) = @_;
    Il y a un tableau et un hash dans tes arguments. Il faut savoir que Perl "déroule" les listes de variables car il transmet ses arguments en tant que scalaires.

    Ainsi, si $fichierIn et $chrSize récupèrent bien les 2 premiers scalaires, @fact récupère carrément tout ce qui reste dans ton @_

    Tu n'aurais eu que ton tableau et pas le hash, je t'aurais bien proposé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     my ($fichierIn,$chrSize,$tailleTab,@fact) = @_;
    Le tableau étant positionné en dernier, il récupérait forcément ce qui restait dans @_ et qui, dans ce cas précis, est pour ton tableau.

    Quand j'ai un hash (ou plusieurs) ou des listes à transmettre en arguments à une fonction, je procède comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my ($fichierIn,$chrSize,$fact,$tailleTab,$hashFT) = @_; 
     
    # ex. pour afficher le 1er élément de ta liste
    print "$fact->[0]";

    Il faut faire appel à ta fonction en transmettant ta liste et ton hash sous forme de références :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Periode::calculPeriode($fichier,$sizeChr,\@ft,$t,\%hashFactors);
    Et là, ça fonctionnera mais fais bien attention à l'exemple que je t'ai donné pour afficher les éléments de ton tableau, n'oublie pas qu'une fois dans ta fonction, tu travailles avec la référence pointant vers ton tableau ou la référence pointant vers ton hash.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Voici un exemple concrèt qui, je l'espère, sera + clair que mon charabia ci-dessus (désolé)

    Soit le petit script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $scalar = 1;
    @list = (1,2,3,4,5);
    %hash = (1, "un", 2, "deux", 3, "trois");
     
    Affiche($scalar, @list, %hash);
    Et voici la fonction Affiche qui ne fait rien d'autre que d'afficher le contenu des variables reçues en paramètres (arguments) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub Affiche {
        my ($scalaire, @tab, %hash) = @_;
     
        print "scalaire contient $scalaire\n";
        print "liste contient :";
        foreach(@tab) {
            print "\t$tab[$_]\n";
        }
        print "hash contient :";
        foreach (sort keys %hash) {
            print "$_ -> $hash{$_}\n";
        }
    }
    Ce qui devrait, normalement, afficher ceci à l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    scalaire contient 1
    liste contient :
        1
        2
        3
        4
        5
    hash contient :
        1 -> un
        2 -> deux
        3 -> trois
    Le problème, comme je disais dans la réponse précédente, @_ (qui reçoit tes arguments) ne reçoit rien d'autre qu'une série de scalaires, rien que des scalaires. En arrivant dans la fonction Affiche, @_ contient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (1, 1, 2, 3, 4, 5, 1, "un", 2, "deux", 3, "trois")
    Et une fois qu'il a réparti les valeurs dans les différentes variables que tu lui indiques :
    $scalaire contient bien 1, ok ici.
    @tab récupère TOUT le reste, soit (1, 2, 3, 4, 5, 1, "un", 2, "deux", 3, "trois") !!!
    Ton hash se retrouve donc non initialisé (undef).

    Pour bien faire, voici le code correct (en utilisant les références) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $scalar = 1;
    @list = (1,2,3,4,5);
    %hash = (1, "un", 2, "deux", 3, "trois");
     
    Affiche($scalar, \@list, \%hash);    # note bien l'antislash !
     
    sub Affiche {
        my ($scalaire, $tab, $hash) = @_; # que des scalaires ici !
     
        print "scalaire contient $scalaire\n";
        print "liste contient :";
        foreach(@{$tab}) {
            print "\t$tab->[$_]\n";
        }
        print "hash contient :";
        foreach (sort keys %{$hash}) {
            print "$_ -> $hash->{$_}\n";
        }
    }
    Compare le code d'origine qui est en erreur avec celui-ci et note bien les différences

  4. #4
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Merci pour tout; tu es un fin pédagogue et surtout sympa de m'avoir donné de ton temps en te mettant à ma portée de débutant.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par BARBIER
    Merci pour tout; tu es un fin pédagogue et surtout sympa de m'avoir donné de ton temps en te mettant à ma portée de débutant.
    C'est normal, quand j'ai commencé, j'en ai bavé avec ces fichues références

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/12/2009, 16h45
  2. Réponses: 4
    Dernier message: 07/01/2009, 23h46
  3. passage d'un argument void* dans une fonction
    Par angel46 dans le forum C
    Réponses: 3
    Dernier message: 25/11/2007, 17h53
  4. Réponses: 11
    Dernier message: 27/06/2007, 15h06
  5. Réponses: 14
    Dernier message: 07/06/2007, 19h40

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