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 :

la fonction library


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Par défaut la fonction library
    Salut a tous me revoila avec une autre casse tete et bien sur toute aide sera welcome

    Exposé:
    -------
    Ecrire un script calcul.pl et une library appelée calcul-lib.pl. La bibliothèque doit contenir une fonction qui prend dans un array de nombres (de taille arbitraire). La fonction calcule alors la moyenne des nombres, le somme des nombres puis et un nouvel array composé des autresdes nombres du premier array divisé par 2. et enfin retournera une nouvelle liste avec toutes ces informations.

    Ma solution
    ------------
    Avant de passer a la creation de la library proprement dite j'ai voulu dans un premier temps creer un script avec une sub-routine (fonction) qui effectue les calculs ça parait peu etre idiot mais ça á semblé marché


    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #!/usr/bin/perl
    #require 'calculation-lib.pl';
     
    my @data = (43, 21, 98, 5, 17, 52, 110, 80);
     
    my ($sum, $number_of_items, $average);
    my  @number_half;
     
    foreach $n (@data) {
        $result = calculation($n);
    }
     
    print "$result\n",
    "Data: ", join (", ", @data), "\n",
    "Sum: $sum\n",
    "Average: $average\n",
    "New Data: ", join(" ", @number_half), "\n";
     
    sub calculation() {
       my $n = shift(@_);
       $number_of_items++;
       $sum += $n;
       push @number_half, $n/2;
       $average = $sum / $number_of_items;
     
       return $result;
     }
    #}
     
    Output
    --------
    Data: 43, 21, 98, 5, 17, 52, 110, 80
    Sum: 426
    Average: 53.25
    New Data: 21.5 10.5 49 2.5 8.5 26 55 40
     
     
    Quand je dit ça semble idiot et bien c'est parceque quand j'essai d'isoler la fonction de calcul dans la librairie
     
    sub calculation() {
        foreach $n (@data) {
       $number_of_items++;
       $sum += $n;
       push @number_half, $n/2;
       $average = $sum / $number_of_items;
     
       return $result;
     }
    }
    1;
    et bien ca marche pas

    Some help please

    Merci pour votre sollicitude

  2. #2
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    Bonjour,

    Si je comprends bien ce que tu as faut :
    Lorsque tu mets ta fonction dans ta librairie, elle n'a plus accès à tes variables globales "$number_of_items", "$average" etc.
    Utilise le pragma strict pour voir ce genre d'erreurs au début de tes fichiers
    Tu as plusieurs possibilités comme par exemple passer ces variables comme arguments de la fonction mais il y en a d'autres

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Par défaut
    un exemple vaut mille commantaires

  4. #4
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    en fait ta fonction doit faire les calculs demandés et de ce fait doit donc déclarer les variables nécessaires aux calculs : sum, average et le tableau de valeurs divisées par 2. Or dans ton exemple, ta fonction utilise des variables qui ne sont pas déclarées dans la fonction de calcul donc ca ne pourra pas marcher. Pour vérifier la portée des variables et voir où et quand on peut les utiliser utilise le pragma strict qui te donnera des erreurs si certaines de tes variables ne sont pas déclarées ( cela sert aussi si tu as fait des fautes de frappes).

    Une fois ces calculs fait la fonction retourne alors directement la somme, la moyenne suivis du tableau de valeurs divisées par 2. L'ordre est important car lorsque l'on récupère ces valeurs : la dernière variable contiendra toutes les variables du tableau.

    calcul.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use strict;
    require 'calcul-lib.pl';
     
    print "Data : ";
    foreach my $value(@data){
      print "$value\t";
    }
    print "\nSum : $sum\nAverage : $average\nDiv 2 :";
    foreach my $value(@div_2){
      print "$value\t";
    }
    print "\n";
    calcul-lib.pl
    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
    20
    21
    22
    23
    24
    25
     
    use strict;
     
     
    sub do_calculation{
     
      my @values = @_;
     
      my $sum = 0;
      my $average = 0;
      my @div_2;
     
      foreach my $value(@values){
        $sum += $value;
        push(@div_2, $value / 2);
      }
     
      my $nb_elements = scalar(@values);
      $average = $sum / $nb_elements;
     
      return($sum,$average,@div_2);
     
    }
     
    1;
    Dernière chose : quand on fait une librairie, un module etc. toujours terminer par un 1; car il doit renvoyer une valeur vraie.

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Par défaut
    sub do_calculation{

    rien dans la fonction que tu me donne généreusement en exemple ne s'y réfère

    et bien entendu les essais ne sont pas concluant ou alors je me trompe quelque part?

    Merci

  6. #6
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    Désolé mauvais copié collé...

    Voici le fichier calcul.pl en entier.
    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
     
    #!/usr/bin/perl -w
     
    use strict;
    require 'calcul-lib.pl';
     
    my @data = (43, 21, 98, 5, 17, 52, 110, 80);
     
    my ($sum,$average,@div_2) = &do_calculation(@data);
     
    print "Data : ";
    foreach my $value(@data){
      print "$value\t";
    }
    print "\nSum : $sum\nAverage : $average\nDiv 2 :";
    foreach my $value(@div_2){
      print "$value\t";
    }
    print "\n";

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/10/2013, 15h22
  2. [XL-2003] Erreur "can't find project or library" sur la fonction Environ
    Par Chakalaka dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/01/2013, 21h21
  3. Réponses: 1
    Dernier message: 30/01/2010, 22h51
  4. Réponses: 0
    Dernier message: 23/12/2009, 12h38
  5. appel de fonction des libraries d'Intel
    Par ulnar dans le forum C
    Réponses: 1
    Dernier message: 15/05/2007, 13h28

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