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 :

Copy de référence et suppression


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 Copy de référence et suppression
    Bonjour,
    Je reviens vous voir car j'ai un petit soucis de référence...
    Je mettrai les détails en dessous mais je vous explique d'abord le principe :
    J'ai crée une classe polygon contenant les champs suivants :
    -name : le nom du polygon
    -points : un tableau contenant des petites tables de hachage à deux éléments (lat et long)
    -rect : une table de hachage contenant 4 éléments : xmin xmax ymin ymax les 4 "coins" du rectangle dans lequel le polygone est inclus
    -nghbr : une table de hachage contenant en clé les noms et en valeurs les références de chaque polygone voisin de celui-ci (deux polygones sont voisins si les rectangles dans lequel ils sont inclus ont des points ou une aire en commun)
    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
    sub new 
    {
            my $class = shift;
            my $name = shift;
            my $points = shift;
    #Points of the polygon
            my $rect = shift;
    #Rectangle which contain the polygon
            my $nghbr ={} ;
    #neighbours of the polygon
            my $self = {
                    name => $name,
                    points => $points,
                    rect => $rect,
                    nghbr => $nghbr
            };
     
            bless ($self,$class);
            return $self;
    }
    Voici mon probleme :
    j'ai un point x,y et je veux en fait savoir dans quel polygone est ce point.
    Pour ce faire, je fais un premier tri ou je regarde les xmin, xmax ymin ymax de chaque polygone. Car par exemple, si xmin est plus grand que x, pas la peine de regarder plus loins, x,y n'est pas dans ce polygone..
    Les polygones sont contenus dans une table de hachage %Polyh.
    Je copie cette table de hachage dans %Sort1 en me disant : comme ça, je fais les modif dans %Sort1 et %Polyh ne sera en aucun cas touché !
    Mais apparement il semblerait que quand je supprime un élément de %Sort1, il est aussi supprimé dans %Polyh car en faisant tourner mon programme pour plusieurs x,y je perd les données au fur et à mesure... Mais ce qui est je trouve bizarre c'est que les clés restent, mais les valeurs sont supprimés..
    Bref, trève de mots, place au code..
    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
    sub localisation1
    {
            %Sort1=%Polyh;
     
            my @keys_of_poly = keys %Sort1;
            print "-Number of elements of sort1 = ".scalar(@keys_of_poly)."\n";
     
     
            foreach my $k ( keys %Polyh )
            {
     
                    print" Polygon : $k \n";
     
    #Test if the Polygons are defined
                    if ( (scalar(keys %{$Polyh{$k}->{rect}}) == 0) || (scalar(keys %{$Polyh{$k}->{nghbr}}) == 0)) {
    #               if ( (!exists $Polyh{$k}->{rect}) || (!exists $Polyh{$k}->{nghbr})) {
                            print"Polygons are not defined for $k..\n";
                            &Debug("--- Error: Polygons are not defined for $k. Skipping to the next polygon\n",6);
                            next;
    #                       return 1;
                    }
     
     
     
    #
    #
                    if ( ${$Sort1{$k}->{rect}}{xmin} > $x )
    #We erase Polygons which xmin is greater than x
                    {
                    print" $Sort1{$k}->{name} Erased \n";
                            if ( exists($Sort1{$k}) )
                            {
                                    delete($Sort1{$k});
                                    foreach my $v ( keys %Sort1 )
                                    {
                                            if ( exists($Sort1{$v}->{nghbr}{$k}) )
                                            {
    #                                               print "- Deleting ".&Dumper($Sort1{$v}->{nghbr}{$k})."\n";
                                                    print "- Deleting $k, which is a neighbour of $v\n";
                                                    delete( $Sort1{$v}->{nghbr}{$k} );
                                            }
                                    }
                            }
                    }
                    else {print"xmin ok\n";}
                    if ( exists($Sort1{$k}) )
                    {
                            if ( ${$Sort1{$k}->{rect}}{xmax} < $x )
    #We erase Polygons which xmax is smaller than x
                            {
                                    print" $Sort1{$k}->{name} Erased \n";
                                    delete($Sort1{$k});
                                    foreach my $v ( keys %Sort1 )
                                    {
                                            if ( exists($Sort1{$v}->{nghbr}{$k}) ) { 
    #                                               print "- Deleting ".&Dumper($Sort1{$v}->{nghbr}{$k})."\n";
    #                                               print "- Deleting $k\n";
                                                    print "- Deleting $k, which is a neighbour of $v\n";
                                                    delete( $Sort1{$v}->{nghbr}{$k} );
                                            }
                                    }
     
                            }
                            else {print"xmax ok\n";}
     
                    }
                    if ( exists($Sort1{$k}) )
                    {
                            if ( ${$Sort1{$k}->{rect}}{ymin} > $y )
    #We erase Polygons which ymin is greater than y
                            {
                                    print" $Sort1{$k}->{name} Erased \n";
                                    delete($Sort1{$k});
                                    foreach my $v ( keys %Sort1 )
                                    {
                                            if ( exists($Sort1{$v}->{nghbr}{$k}) ) {
     
    #                                               print "- Deleting ".&Dumper($Sort1{$v}->{nghbr}{$k})."\n";
    #                                               print "- Deleting $k\n";
                                                    print "- Deleting $k, which is a neighbour of $v\n";
                                                    delete( $Sort1{$v}->{nghbr}{$k} );
                                            }
                                     }
     
                            }
                            else {print"ymin ok\n";}
     
                    }
                    if ( exists($Sort1{$k}) )
                    {
                            if ( ${$Sort1{$k}->{rect}}{ymax} < $y )
    #We erase Polygons which ymax is smaller than y
                            {
                                    print" $Sort1{$k}->{name} Erased \n";
                                    delete($Sort1{$k});
                                    foreach my $v ( keys %Sort1 )
                                    {
                                            if ( exists($Sort1{$v}->{nghbr}{$k}) ) { 
    #                                               print "- Deleting $k\n";
                                                    print "- Deleting $k, which is a neighbour of $v\n";
                                                    delete( $Sort1{$v}->{nghbr}{$k});
                                            }
                                    }
     
                            }
                            else {print"ymax ok\n";}
     
                    }
            }
    ##########
    #whatever is remaining
     
    print"Whatever is remaining :\n";
            foreach my $j ( keys %Sort1 )
            {
                    print" key : $j \n";
            }
    ##########
    }
    Voilà, qu'en pensez-vous ?

  2. #2
    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
    Laissez tomber, en fait je me suis rendue compte de pleins d'autres erreur donc je marque ce sujet en délestage jusqu'à ce que j'ai fait un peu de nettoyage.
    A++

  3. #3
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    J'ai l'impression – sauf si c'est un problème de copier coller – que %Sort1 est une variable globale, d'où le souci : elle est partagée entre chaque appel à localisation1.

    Utilises-tu le pragma strict au fait ?

  4. #4
    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
    Bien vu Ibis il m'a fallu du temps avant de me rendre compte que l'erreur principale venait surement de là (je l'ai vu juste avant de mettre ce post en délestage).
    C'est que au départ, mon programme en fait était juste censé tourner pour un point et non pas plusieurs à la suite...
    La solution que j'ai trouvé c'est de retourner %Sort1 en sortie de localisation 1 et de mettre une référence de %Sort1 en paramètre de mes autres fonctions mais ça bug...je ne retrouve pas toute ma structure...
    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
      my %Sort1=&localisation1();
            print"Dans Sort1 juste après localisation1:\n";
            foreach my $Pol ( keys %Sort1) {
                    print"$Sort1{$Pol}->{name}\n";
                   foreach my $minmax ( keys  %{$Sort1{$Pol}->{rect}} )
                   {
                           print " $minmax : ${$Sort1{$Pol}->{rect}}{$minmax}\n";
                   }
                    print"neighbour :\n";
     
                    foreach my $neighbours ( keys  %{$Polyh{$Pol}->{nghbr}} )
                    {
                            print " $neighbours\n";
                    }
                    print"\n\n";
     
            }
     
            my $test=&localisation2(\%Sort1);
    #If before localisation2 no Polygon is found, it's finished
            if ( $test eq "" )
            {
                    print"Nothing found, sorry !\n";
     
     
            }
    #else we test the neighbours of the Polygon found and print the result;
            else
            {
                    my %Result=&finallocalisation($test,\%Sort1);
                            print"The $nameship is in that area(s)  : \n";
                            foreach my $k ( keys %Result )
                                     {print"$k\n";}
            }
     
            print"\n \n";
     
    }
    avec un test au début de localisation2 :
    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
    #Find a Polygon which the point is in
    #If we find one, return it and just the if the point is in the Polygon's neightbours
    sub localisation2
    {
            my $Sort1=shift;
            print"Dans Sort1 au début de localisation2:\n";
            foreach my $Pol ( keys %$Sort1) {
                    print"key : $Pol\n";
                    print"name : ${$Sort1->{$Pol}}->{name}\n";
                   foreach my $minmax ( keys  %{${$Sort1->{$Pol}}->{rect}} )
                   {
                           print "rectangle :  $minmax : ${{$Sort1->{$Pol}}->{rect}}{$minmax}\n";
                   }
                    print"neighbours :\n";
     
                    foreach my $neighbours ( keys  %{${$Sort1->{$Pol}}->{nghbr}} )
                    {
                            print " $neighbours\n";
                    }
                    print"\n\n";
     
            }
    Ibis, penses-tu que tu pourrais m'aider à écrire le nom du polygone car apparement il n'aime pas cette écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${$Sort1->{$Pol}}->{name}
    ni celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {$Sort1->{$Pol}}->{name}
    , la derniere me mettant
    name : {Polygon=HASH(0xd5a658)}->{name}
    Et si tu as une idée de ce que je fais mal en passant ma table de hachage d'une fonction à l'autre..je suis preuneuse aussi

  5. #5
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Citation Envoyé par Saita Voir le message
    Et si tu as une idée de ce que je fais mal en passant ma table de hachage d'une fonction à l'autre..je suis preuneuse aussi
    Tu ne peux pas passer (correctement) une table associative par valeurs, tu dois la passer par référence. Or vu ton affection de la valeur de retour de localisation1, il semble que tu retournes le hash et pas une réf sur le hash.

    Si tu retournes une référence, tu devrais alors accéder au nom comme ça :
    $Sort1->{$Pol}->{name}, si j'ai bien compris ta structure. (rappel $hr->{key} accède à la valeur associée à la clé key dans la table associative vers laquelle point $hr).

  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
    Comme quand je testais ce qu'il y avait dans Sort1 une fois lacalisation1 finie, et que le contenu était juste, je pensais pouvoir le faire comme ça. Mais tu as raison, en faisant tout avec des références, plus ce soucis là.
    Si je peux me permettre j'ai un autre soucis de référence (sacrée référence..)
    Donc si j'ai été claire, tu sais maintenant que dans ma réféence Sort1 j'ai des objets de type Polygone (ou plutot, référence sur Polygone).
    ma fonction isin prend un paramètre une référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #Test is the point is in a Polygon
    sub isin
    {
            print"test\n";
            my $poly=shift;
            print "Nom de mon polygone....
    et je veux l'appeler dans ma fonction localisation2 comme ceci :
    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
            foreach my $k ( keys %$Sort1 )
            {
                    print"$k polygon tested is the point is in. Structure : $Sort1->{$k} \n";
                    if ( &isin($Sort1->{$k}) == 0 )
                    {
                            print"Polygon $k erased\n";
                            delete($Sort1->{$k});
                    }
                    elsif ( &isin($Sort1->{$k}) == 1 )
                    {
                            print" I have found one ! It's $k\n";
                            return $k;
                    }
     
            }
    Mais voilà ce que j'ai en sortie :
    UK polygon tested is the point is in. Structure : Polygon=HASH(0x112db658)
    test
    Content-type: text/html

    Error: Can't use string ("UK") as a SCALAR ref while "strict refs" in use at ./L
    ocationPoint.pl line 180.
    Je comprend pas non plus pourquoi il me dit ça.. Je suppose que j'ai mal écrit $Sort1->{$k} car quand Sort1 était en varaible globale je n'avais aucun problème de ce coté là..

  7. #7
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    J'ai du mal à suivre tes bouts de code un peu décousus, désolé.

    Apparrement tu fais quelque chose qui équivaut à $k-> : tu dois traiter la valeur d'une clé de %$Sort1 comme une référence quelque part mais je ne vois pas où.

    Poste ton code (un peu nettoyé) avec les indications sur où ça ne va pas.

    PS L'usage du debugger est une bonne idée quand on est perdu

  8. #8
    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
    Desolee pour les bouts de code... Je me doutais un peu que se serait pas tres evident a comprendre mais j'ai un peu peur que si je met tout mon programme se soit un peu lourd...
    Je vais essayer de faire du nettoyage pour voir et je reviens
    Merci encore Ibis

    Edit : ou puis-je trouver de la doc pour le debugger ? Ca a l'air d'etre une bonne idee, mais je ne vois pas trop comment l'utiliser..

  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
    J'ai un peu deserte le sujet que j'ai ouvert
    Il s'avere qu'apres nettoyage et beaucoup d'attention, les indications que tu m'as donne Ibis ont suffit a resoudre ce qui n'allait pas
    Mais soit dit en passant, je veux bien de la doc sur le debbuger
    Sujet en resolu donc

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

Discussions similaires

  1. question de design : copie ou référence?
    Par screetch dans le forum C++
    Réponses: 9
    Dernier message: 26/10/2010, 11h50
  2. [C#] Suppression des références et clauses using inutiles
    Par heavydrinker dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/08/2006, 15h25
  3. Réponses: 4
    Dernier message: 14/07/2006, 02h30
  4. Réponses: 11
    Dernier message: 21/05/2006, 14h39
  5. Tranches : Référence ou copie ?
    Par JolyLoic dans le forum Général Python
    Réponses: 1
    Dernier message: 11/08/2005, 16h10

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