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 :

Probleme avec une fonction prenant des references en parametre et une boucle !


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut Probleme avec une fonction prenant des references en parametre et une boucle !
    Bonjour,
    Comme cela fait longtemps que je tourne en rond je me suis enfin decidee a m'inscrire et poster sur ce site qui m'a deje beaucoup aide.
    Alors voila,
    J'ai des references $P1 ... $P5 qui sont en fait des tableaux a deux dimensions.
    Et une fonction neighbour qui prend 2 de ces tableaux en parametres.

    Quand je tape ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $isngb=neighbour($P1,$P2);
    print"$isngb \n";
    tout va bien ! Il me retourne bien 0 qui est le resultat attendu pour ces 2 parametres.

    Mais voila, je voudrais faire une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (my $i=1;$i<=5;$i++)
    {
            for (my $j=$i+1;$j<=5;$j++)
            {
    Pour calculer tous mes neighbour... Et la c'est le drame !
    J'ai d'abord fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (my $i=1;$i<=5;$i++)
    {
            for (my $j=$i+1;$j<=5;$j++)
            {
               my $isngb=neighbour("\$P$i","\$P$j");
    mais il en voulait pas...
    alors j'ai voulu prendre un chemin detourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $temp='$P'."$i";
    print "$temp \n";
    J'ai verifie il me met bien $P1 $P2 ...

    mais quand je le passe en parametre de neighbour dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $isngb=neighbour("$temp",$P2);
    J'ai toujours le meme message d'erreur :
    Can't use string ("$P1") as an ARRAY ref while "strict refs" in use at ./polygontest.pl line 26.
    Donc je ne sais plus trop quoi faire...
    Je debute tout juste avec Perl (je viens de finir de lire l'introduction mise sur ce forum) donc il se peut que j'ai fait une erreur tout bete mais je la vois pas

    Des idees pour m'aider ?

    ps : desolee pour le manque d'accent..(clavier qwerty)

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ce que tu souhaites faire, c'est utiliser des symboles dynamiques, c'est à dire construire le nom de tes symboles dynamiquement, ce qui n'est pas recommandé, voire même interdit lorsque tu utilises "use strict" (comme tu devrais le faire).
    Pour cela, il faudrait alors écrire tes références ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (my $i=1;$i<=5;$i++)
    {
            for (my $j=$i+1;$j<=5;$j++)
            {
               my $isngb=neighbour(${P$i}, ${P$j});
    Cependant, je te conseille une solution plus élégante : construit un tableau contenant tes références :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my @P = ($P1, $P2, $P3, $P4, $P5);
    for (my $i=1;$i<=5;$i++)
    {
            for (my $j=$i+1;$j<=5;$j++)
            {
               my $isngb=neighbour($P[$i],$P[$j]);
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Merci beaucoup de m'avoir repondu
    Malheureusement, comme tout bon programme informatique, il ne fait pas ce que je veux malgres ton aide ( mais comme dirait mon prof : mais le pire c'est qu'il fait exactement ce qu'on lui dit ! Mais on a pas du lui dire ce qu'on voulait faire...)

    D'abord, je te rassure, j'utilise bien use strict. Autant essayer d'ecrire proprement.

    J'aimais bien ta premiere idee !
    Mais quand je l'ai essayee il a l'air de considerer que P est une methode...
    Can't call method "P" without a package or object reference at ./polygontest.pl line 152.
    Quand a la deuxieme..erreur egalement mais je crois que je vais devoir detailler plus mon programme pour essayer de comprendre ce qui cloche.

    Donc..J'explique tout.. J'espere que la longueur de l'explication ne te disuadera pas de m'aider..

    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
      1 #! /usr/bin/perl -W
      2 package Polygon;
      3 use strict;
      4 
      5 #####Data
      6 use Exporter;
      7 our @ISA=qw(Exporter);
      8 our @EXPORT=qw($P1 $P2 $P3 $P4 $P5 $poly1 $poly2 $poly3 $poly4 $poly5);
      9 
     10 our $P1=[ [0,3],[1,4],[3,0],[1,-2],[-1,-1],[-3,0],[-2,1],[-3,2] ];
     11 our $P2=[ [-3,2],[-4,-2],[-4,7],[-5,-6],[-6,3],[-7,0],[-8,-4],[-10,4],[-12,7],[-14,-3],[-14,1],[-19,5] ];
     12 our $P3=[ [-7,1],[-8,4],[-9,-2],[-9,2],[-10,0],[-12,-2],[-11,3],[-13,1] ];
     13 our $P4=[ [-5,-4],[0,-7],[4,-4],[5,-2],[6,-8],[6,-5],[7,-2],[8,-4] ];
     14 our $P5=[ [6,-3],[6,8],[8,4],[12,6],[13,1],[14,10] ];
     15 our @Pp = ($P1, $P2, $P3, $P4, $P5);
     16 ####
    Ca c'est les donnes sur lesquelles je travaille (J'y ai rajoute ton tableau)
    Les tableaux sont en fait des tableaux de points dans un plan et les Pi representent des polygones.

    Ma premiere fonction cherche pour un polygone donne, le xmin,xmax,ymin,ymax.
    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
     rectangle($P1);
     22 
     23 sub rectangle
     24 {
     25 my ($P)=@_;
     26 
     27 my $xmin=$P->[0][0];
     28 my $xmax=$P->[0][0];
     29 my $ymin=$P->[0][1];
     30 my $ymax=$P->[0][1];
     31 
     32 #print "$xmin $xmax $ymin $ymax\n";
     33 my $taille=@$P;
     34 #print "$taille\n";
     35 for (my $i=1;$i<$taille;$i ++)
     36 {
     37 #       for (my $j=0;$j<=1;$j++)
     38 #       {
     39 #       print " $P->[$i][$j]\n";
     40         if ( $P->[$i][0] > $xmax )
     41                 { $xmax=$P->[$i][0];}
     42         if ( $P->[$i][0] < $xmin )
     43                 { $xmin=$P->[$i][0];}
     44         if ( $P->[$i][1] > $ymax )
     45               { $ymax=$P->[$i][1];}
     46         if ( $P->[$i][1] < $ymin )
     47                 { $ymin=$P->[$i][1];}
     48 #       }
     49 }
     50 #print" $xmin,$ymin,$xmax,$ymax \n";
     51 my $rectangle ={
     52                 xmin => $xmin,
     53                 ymin=> $ymin,
     54                 xmax=>$xmax,
     55                 ymax=>$ymax
     56 };
     57 return $rectangle;
     58 
     59 }
    Voila pour la premiere fonction.
    La deuxieme prend deux polygones et determine si ils sont voisins (c'est a dire si ils se touchent ou ont une aire commune. Je verifie aussi si l'un ne serait pas inclu dans l'autre)
    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
     60 
     61 sub neighbour 
     62 {
     63 
     64 my ($Pol1)=shift;
     65 my ($Pol2)=shift;
     66 
     67 my $rect1=rectangle($Pol1);
     68 my $rect2=rectangle($Pol2);
     69 
     70 #Test if Pol1 include in Pol2 
     71 if ($rect1->{xmin}>=$rect2->{xmin} && $rect1->{xmax}<=$rect2->{xmax} &&
     72 $rect1->{ymin}>=$rect2->{ymin} && $rect1->{ymax}<=$rect2->{ymax})
     73         {return "Include";}
     74 #Test if Pol2 include in Pol1 
     75 elsif ($rect2->{xmin}>=$rect1->{xmin} && $rect2->{xmax}<=$rect1->{xmax} &&
     76 $rect2->{ymin}>=$rect1->{ymin} && $rect2->{ymax}<=$rect1->{ymax})
     77         {return "Contain";}
     78 #Test if the point (xmin,ymin) of Pol1 is in Pol2
     79 elsif ($rect1->{xmin}<=$rect2->{xmax} && $rect1->{xmin}>=$rect2->{xmin} &&
     80 $rect1->{ymin}<=$rect2->{ymax} && $rect1->{ymin}>=$rect2->{ymax})
     81         {return 1;}
     82 #Test if the point (xmin,ymax) of Pol1 is in Pol2
     83 elsif ($rect1->{xmin}<=$rect2->{xmax} && $rect1->{xmin}>=$rect2->{xmin} &&
     84 $rect1->{ymax}<=$rect2->{ymax} && $rect1->{ymax}>=$rect2->{ymax})
     85         {return 1;}
     86 #Test if the point (xmax,ymax) of Pol1 is in Pol2
     87 elsif ($rect1->{xmax}<=$rect2->{xmax} && $rect1->{xmax}>=$rect2->{xmin} &&
     88 $rect1->{ymax}<=$rect2->{ymax} && $rect1->{ymax}>=$rect2->{ymax})
     89         {return 1;}
     90 #Test if the point (xmax,ymin) of Pol1 is in Pol2
     91 elsif ($rect1->{xmax}<=$rect2->{xmax} && $rect1->{xmax}>=$rect2->{xmin} &&
     92 $rect1->{ymin}<=$rect2->{ymax} && $rect1->{ymin}>=$rect2->{ymax})
     93         {return 1;}
     94 else {return 0;}
     95 }
     96 
     97 
     98 ####
    Le but etant de creer une classe polygone contenant : le tableau de ses points, le rectangle qui le contient, et les polygones qui lui sont voisins :
    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
    100 sub new 
    101 {
    102         my $class = shift;
    103         my $points = shift;
    104         my $rect = shift;
    105         my $nghbr =[] ;
    106 #neighbours 
    107         my $self = {
    108                 points => $points,
    109                 rect => $rect,
    110                 nghbr => $nghbr
    111         };
    112 
    113         bless ($self,$class);
    114         return $self;
    115 
    116 
    117 }
    ...Tout ca pour parler du bout de code qui nous interesse !
    En fait, je voudrais tout simplement remplir mon tableau nghbr pour chaque polygone...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    129 our $poly1 = new Polygon($P1,rectangle($P1));
    130 our $poly2 = new Polygon($P2,rectangle($P2));
    131 our $poly3 = new Polygon($P3,rectangle($P3));
    132 our $poly4 = new Polygon($P4,rectangle($P4));
    133 our $poly5 = new Polygon($P5,rectangle($P5));
    Et viens ensuite la boucle dont je te parlais suivie d'un bout de code que j'ai mis en commentaire car j'ai quasiment le meme probleme...
    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
    136 my $test=neighbour($P1,$P2);
    137 print"$test\n";
    138 #print"$poly1->{nghbr}\n";
    139 #push(@{$poly1->{nghbr}},"P2");
    140 
    141 for (my $i=1;$i<=5;$i++)
    142 {
    143         for (my $j=$i+1;$j<=5;$j++)
    144         {
    145 #my $temp='$P'."$i";
    146 #print "$temp \n";
    147 
    148 #   my $isngb=neighbour($P1,$P2);
    149 #print"$isngb \n";
    150 
    151 # my $isngb=neighbour("$temp",$P2);
    152 
    153 
    154         my $isngb=neighbour($Pp[$i],$Pp[$j]);
    155         print"$i $j \n";
    156         print"$isngb \n";
    157 
    158 #        if ($isngb==1)
    159 #
    160 #                {
    161 #                push(@{$poly2->{nghbr}},"P2");
    162 #                push(@{$poly$j->{nghbr}},"P$i");
    163 #                }
    164         }
    165 }
    166 1;
    Voila on est arrive au bout

    Bref tout ca pour dire que quand j'essaie le coup du tableau, il me met des erreurs du cote de la fonction neighbour, des le premier "if" :
    Contain
    0
    0
    Use of uninitialized value in numeric ge (>=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric ge (>=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric le (<=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric lt (<) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric gt (>) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric lt (<) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric gt (>) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric lt (<) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric gt (>) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric lt (<) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric gt (>) at ./polygontest.pl line 71.
    0
    0
    0
    Use of uninitialized value in numeric ge (>=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric ge (>=) at ./polygontest.pl line 71.
    ...
    Voila voila... Ce qui me parait bizarre c'est qu'il a l'air de bien vouloir passer certain polygone puisqu'il affiche 0 parfois... Mais pour d'autre non. En attendant une reponse je vais essayer de voir manuellement ou ca bloque exactement... Mais j'ai l'impression que c'est a force de concatener des reference tableau...Je vais me perdre en cours de route !
    Donc a tres bientot dans la journee j'espere

    Edit : Et en plus je n'avais pas fait attention mais du coup les resultats sont faut : my $test=neighbour($P1,$P2); donne 1 et non pas Contain et de meme pour les autres, il devrait y avoir des 1 alors qu'il n'y a que des 0...

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Sans les numéros de ligne, c'est difficile, mais visiblement, certains rectangles sont "vides" de données, ou manquent de coordonnées.
    Il faudrait que tu affiches le contenu des paramètres de neighbour($P[$i],$P[$j]) avant son appel, de cette manière par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    use Data::Dumper;
     
    ...
     
    for (my $i=1;$i<=5;$i++)
    {
        for (my $j=$i+1;$j<=5;$j++)
        {
            print "neighbour called with i=$i, j=$j:\n", Data::Dumper->Dump([$P[$i], $P[$j]], [qw(*P$i *P$j)]);
            my $isngb=neighbour($P[$i],$P[$j]);
           print"$isngb \n";
    ...
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Ok. Je vais rajouter les numeros de ligne et ce que tu me demande et je reposte

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Alors...Il y a beaucoup de chose... Je pense que je ne vais poster que le debut, le reste est du meme tonneau :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    0
    neighbour called with i=1, j=2:
    @P$i = (
             [
               -3,
               2
             ],
             [
               -4,
               -2
             ],
             [
               -4,
               7
             ],
             [
               -5,
               -6
             ],
             [
               -6,
               3
             ],
             [
               -7,
               0
             ],
             [
               -8,
               -4
             ],
             [
               -10,
               4
             ],
             [
               -12,
               7
             ],
             [
               -14,
               -3
             ],
             [
               -14,
               1
             ],
             [
               -19,
               5
             ]
           );
    @P$j = (
             [
               -7,
               1
             ],
             [
               -8,
               4
             ],
             [
               -9,
               -2
             ],
             [
               -9,
               2
             ],
             [
               -10,
               0
             ],
             [
               -12,
               -2
             ],
             [
               -11,
               3
             ],
             [
               -13,
               1
             ]
           );
    Contain
    neighbour called with i=1, j=3:
    @P$i = (
             [
               -3,
               2
             ],
             [
               -4,
               -2
             ],
             [
               -4,
               7
             ],
             [
               -5,
                    -6
             ],
             [
               -6,
               3
             ],
             [
               -7,
               0
             ],
             [
               -8,
               -4
             ],
             [
               -10,
               4
             ],
             [
               -12,
               7
             ],
             [
               -14,
               -3
             ],
             [
               -14,
               1
             ],
             [
               -19,
               5
             ]
           );
    @P$j = (
    ...
    Edit : D'apres ce que je comprend, les indices sont un peu decales... Le 1er correspond en fait au deuxieme et ainsi de suite... Et donc forcement a l'indice on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    neighbour called with i=1, j=5:
    ...
    $P$j = undef;
    0
    neighbour called with i=2, j=3:
    Mais par contre je ne comprend pas pourquoi c'est decale ni pourquoi il s'arrete a i=4 :
    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
    0 
    neighbour called with i=4, j=5:
    @P$i = (
             [
               6,
               -3
             ],
             [
               6,
               8
             ],
             [
               8,
               4
             ],
             [
               12,
               6
             ],
             [
               13,
               1
             ],
             [
               14,
               10
             ]
           );
    $P$j = undef;
    Use of uninitialized value in numeric ge (>=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric le (<=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric ge (>=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric le (<=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric le (<=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric le (<=) at ./polygontest.pl line 71.
    Use of uninitialized value in numeric le (<=) at ./polygontest.pl line 71.
    0 
    [root@satm-dev1-satm1 sonia]# ./polygontest.pl > test.txt

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En ajoutant les traces que je te demande, tu trouveras facilement les données qui sont incorrectes, ce qui t'aidera à trouver où se trouve le bug...
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Normal, les tableaux en perl commencent toujours par 0... je n'avais même pas vu ça dans ton code.
    Remplace donc tes boucles par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (my $i=0; $i < @P ;$i++)
    {
        for (my $j=$i+1 ;$j < @P ;$j++)
        {
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Euh...Je pense que c'est ce que j'ai fait... Ce que je viens de poster est le resultat de ce qui sort avec le trace que tu m'a demande e rajouter (elle est francaise ma phrase ??)
    Edit : lol. Oui en fait c'est qu'a la base j'utilisais pas de tableau c'est pour ca
    Je vais changer..Et je croise les doigts

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Super ! Ca marche. Merci beaucoup
    Apparement mon programme neighbour ne marche pas comme je veux en fait car a part $P3 qui est bien contenu dans $P2 il devrait y avoir plus de 1 pour les autres... Mais ca c'est une autre histoire..
    Peux-tu quand meme m'expliquer pourquoi ta premiere solution ne marche pas ?
    Encore merci

    Edit : J'ai oublie de te demander... Comment puis-je utiliser la fonction push apres ? Peut etre vaut il mieux que j'ouvre un autre sujet pour cette partie la..

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour que la première solution marche, il fallait ajouter des " " autour du nom de la variable, et supprimer use strict, car ce type de déréférencement est interdit avec ce pragma.
    A oublier donc dans ton cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
      no strict qw(refs);
      my $isngb=neighbour(${"P$i"}, ${"P$j"});
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Ok. Et pour la fonction push ?
    J'ai essaye un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my $isngb=neighbour($P[$i],$P[$j]);
    161         print"$isngb \n";
    162  
    163         if ($isngb==1)
    164  
    165                 {
    166                 my $pj="P$j";
    167                 my $pi="P$i";
    168                 my $Polyi="\$poly$i";
    169                 my $Polyj="\$poly$j";
    170                 print"Eh!\n"; 
    171                 push(@{$Polyi->{nghbr}},"$pj");
    Mais j'ai :
    [root@satm-dev1-satm1 sonia]# ./polygontest.pl
    1
    Eh!
    Can't use string ("$poly0") as a HASH ref while "strict refs" in use at ./polygontest.pl line 171.
    [root@satm-dev1-satm1 sonia]#
    Le probleme etant a mon avis que je ne sais pas encore utiliser les classes...
    J'ai essaye de trouver des article a ce sujet mais tout ceux que je trouve se contente de mettre des scalaires dans les champs des classes et pas des tableaux ou autre.. (est-ce que j'utilise bien le bon vocabulaire ?)

    Je repose ma question : est-il preferable que j'ouvre un autre sujet pour cette question ?
    Merci encore a toi de prendre du temps pour me repondre. C'est sympa

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Cela ne me gêne pas de continuer dans ce sujet.
    Pour ton push, le premier argument de cette fonction doit être de type array.

    Si @{$Polyi->{nghbr}} n'est pas une array (autrement dit, si $Polyi->{nghbr} n'est pas une référence à une array), tu auras un message d'erreur.
    Autrement dit, $Polyi doit être une référence vers un hash, donc une clé est nghbr.
    Or, $Polyi est une chaine de caractère... ça ne va effectivement pas fonctionner.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  14. #14
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Ok. Je vois le probleme mais je seche... au depart je ne sais pas si tu as vu mais je voulais faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     push(@{$poly$j->{nghbr}},"P$i");
    Mais je me retrouve avec sensiblement le meme probleme que plus haut..
    Donc je me suis dit que le mieux etait peut etre de d'abord mettre en variable separee par exemple $pi="P$i" mais ca ne marche que parce que c'est bien un string que je veux mettre..
    Comment lui dire que je veux $poly$j de type polygone et mettre dans le tableau nghbr (qui est un champs de polygone) mon string $pi...
    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    151 push(@{$poly1->{nghbr}},"P1");
    Ce code a l'air de marcher.. donc ca n'est pas un probleme de comprehension de la structure de ma part a prioris

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tu dois faire comme présenté précédemment, à savoir, créer un tableau de tes objets polygones... car effectivement, dans le cas contraire, tu tentes de déréférencer une référence d'après son nom, et non d'après une référence à cet objet, ce qui est interdit avec le pragma strict.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  16. #16
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour remplir un array d'un attribut d'un objet, considérons $poly comme la référence d'un objet.
    Pour ajouter un élément au champs "table" de cet objet, il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$poly->{table}}, "...";
    Nota : dans ton dernier exemple, il manquait le $ devant poly1
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Alors j'ai mis ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    134 our @Poly = ( $poly1, $poly2, $poly3, $poly4, $poly5);
    et ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     if ($isngb==1)
    165 
    166                 {
    167                 my $pj="P$j";
    168                 my $pi="P$i";
    169                 print"Eh!\n";
    170                 push($Poly[$i]->{nghbr},"$pj");
    et resultat :
    [root@satm-dev1-satm1 sonia]# ./polygontest.pl
    Type of arg 1 to push must be array (not hash element) at ./polygontest.pl line 170, near ""$pj")"
    Execution of ./polygontest.pl aborted due to compilation errors.
    [root@satm-dev1-satm1 sonia]#
    pourtant quand je test le type il me met bien que c'est un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    170                 print"$Poly[0]->{nghbr}\n";
    [root@satm-dev1-satm1 sonia]# ./polygontest.pl
    1
    Eh!
    ARRAY(0x865a68)
    Edit : Oui pour poly1 j'avais deja rectifiee par moi meme et change mon post
    Je vais manger et je reviens dans une heure. Si ce n'est pas deja fait pour toi, bon appetit

  18. #18
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    push attends comme premier paramètre, un tableau, pas une référence à un tableau.
    Tu dois écrire ton push ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push(@{$Poly[$i]->{nghbr}}, "$pj");
    Perl is a list of insipide and stupid brackets... oups... désolé.

    Pour le rendre un poil plus lisible, et faire la différence entre les fonctions "builtin" du langage, et tes propres fonctions, je préfère toujours éviter les parenthèses pour passer les arguments à push :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$Poly[$i]->{nghbr}}, "$pj";
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  19. #19
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Oh la la... Et dire qu'en plus je l'avais bien marque juste au-dessus...
    Merci
    Pour l'instant j'ai une ou deux erreurs mineures en plus mais je pense pouvoir les reparer toute seule.
    Je suis a la fois emerveillee et effrayee par Perl.. J'ai l'impression qu'avec ce langage il est possible de faire quasiment ce qu'on veut a condition d'avoir trouve le bon module, mais d'un autre cote, je me sens un peu toute petite par rapport a la quantite de chose a savoir.. Bon faut dire aussi que je ne connais Perl que depuis 2 semaines et que je n'ai commence a programmer en Perl que depuis une semaine.. C'est peut etre normal
    En tout cas c'est rassurant de savoir que si j'ai un probleme j'aurais quelqu'un pour m'aider ici En souhaitant un jour en connaitre assez pour pouvoir rendre la pareille a quelqu'un d'autre.
    Encore merci et bonne journee
    Post Resolu

  20. #20
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je te rassure, il y a d'autres guru ici...
    Sinon, les classiques pour démarrer :
    perldoc perlsyn
    perldoc perlop
    perldoc perlfunc
    perldoc perldata
    Les FAQ de DVP, les sources, et autres tuto...
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 17
    Dernier message: 16/07/2012, 14h10
  2. Réponses: 1
    Dernier message: 27/03/2012, 17h14
  3. Renommer une fonction dans un select ou concevoir autrement une fonction
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 30/05/2008, 17h17
  4. mettre des tableaux en parametre d'une fonction
    Par vbeno dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/01/2008, 03h14
  5. [C#] Passer des contrôles comme parametre dans une fonction
    Par sara21 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/09/2006, 13h05

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