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 :

Problème sur la table de hashage


Sujet :

Langage Perl

  1. #21
    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
    Lorsqu'une variable est "initialisée", elle est forcément définie Par ailleurs, ici, elle est d'abord définie (sans valeur, donc à undef), puis initialisée.
    Et je n'ai pas vu, en survolant le script, de problème d'étendue de la définition.

    Par contre, en relisant précisément, on s'aperçoit qu'elle est initialisée dans "un cas de if", et qu'elle est utilisée dans ce cas, et dans un 2e cas de if. Si on exécute le cas de if qui ne contient pas l'initialisation, alors ça plante. Il faudrait plutôt initialiser $maxDVD lors de sa définition :

    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

  2. #22
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    bon @laisskamal, j'ai un peu de mal avec la tournure que prend ta demande. désolé pour ce petit coup de gueule sans aucune animosité, c'est juste qu'à un moment si tu veux apprendre/progresser il faut un peu s'intéresser au problème

    on t'aide (je devrais dire on a fait les modifs de ton code) et tu ne collabores pas vraiment (pas de réponse aux questions, pas de prise d'initiative sur les modifs à faire). Tu donnes un peu l'impression d'attendre qu'on fasse le boulot à ta place.

    Commence par 1 réfléchir à ce que tu souhaites faire (appuies toi sur les questions à la fin de mon précédent post), ensuite demande si tu as un blocage (technique ou de conception) et nous t'aiderons avec plaisir.

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Par ailleurs, ici, elle est d'abord définie (sans valeur, donc à undef)
    "defini à undef" pour moi veut dire non defini ...

  4. #24
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Services de proximité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 5
    Points
    5
    Par défaut Je m'excuse
    Citation Envoyé par 6ril23 Voir le message
    bon @laisskamal, j'ai un peu de mal avec la tournure que prend ta demande. désolé pour ce petit coup de gueule sans aucune animosité, c'est juste qu'à un moment si tu veux apprendre/progresser il faut un peu s'intéresser au problème

    on t'aide (je devrais dire on a fait les modifs de ton code) et tu ne collabores pas vraiment (pas de réponse aux questions, pas de prise d'initiative sur les modifs à faire). Tu donnes un peu l'impression d'attendre qu'on fasse le boulot à ta place.

    Commence par 1 réfléchir à ce que tu souhaites faire (appuies toi sur les questions à la fin de mon précédent post), ensuite demande si tu as un blocage (technique ou de conception) et nous t'aiderons avec plaisir.
    Bonjour,

    Je suis débutant en programmation. J'essaie de comprendre mes erreurs. Je tiens à m'excuser. je demande seulement à connaitre mes erreurs pour ne plus les reproduire.

  5. #25
    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
    Citation Envoyé par vidici Voir le message
    "defini à undef" pour moi veut dire non defini ...
    Pas tout fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ perl -E 'use strict; use warnings; print $a'
    Name "main::a" used only once: possible typo at -e line 1.
    Use of uninitialized value $a in print at -e line 1.
     
    philou67430@localhost //home/philou67430
    $ perl -E 'use strict; use warnings; my $a; print $a'
    Use of uninitialized value $a in print at -e line 1.

    OK, je t'accorde que ces deux états sont très proches.

    Citation Envoyé par laisskamal Voir le message
    Bonjour,

    Je suis débutant en programmation. J'essaie de comprendre mes erreurs. Je tiens à m'excuser. je demande seulement à connaitre mes erreurs pour ne plus les reproduire.
    J'ai répondu à ton problème sur $maxDVD : as-tu compris et corrigé ?
    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

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Services de proximité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 5
    Points
    5
    Par défaut Problème au niveau de la restitution et de l'emprunt
    Citation Envoyé par Philou67430 Voir le message
    Pas tout fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ perl -E 'use strict; use warnings; print $a'
    Name "main::a" used only once: possible typo at -e line 1.
    Use of uninitialized value $a in print at -e line 1.
     
    philou67430@localhost //home/philou67430
    $ perl -E 'use strict; use warnings; my $a; print $a'
    Use of uninitialized value $a in print at -e line 1.

    OK, je t'accorde que ces deux états sont très proches.


    J'ai répondu à ton problème sur $maxDVD : as-tu compris et corrigé ?
    J'ai toujours un soucis pour les étapes 4 et 5. En effet, le code ne s'"exécute pas comme je le voudrais. Je demande à l'utilisateur de saisir l'utilisateur. Ensuite, je lui demande combien de dvd il voudrais emprunter.. J'ai seulement besoin que vous m'aidiez à optimiser ce 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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $i=0;
    my @DVD;
    my $emprunteur;
    my $prenom;
    my $n=0;
    my %abonnes;
    my $nbDVD;
    my $newAbonne;
    my $user;
    my $maxDVD=-1;
    my $restituer;
    my $abonnes;
    my $DVD;
     
    # La liste des emprunteurs est donnée par une table de hachage %abonnes
    # Clé : indentifiant = prénom pour simplifier
    # Valeur : nb de DVD empruntés
    # Création de la table :
    $abonnes{"Guillaume"} = 3;
    $abonnes{"Maxime"} = 15;
    $abonnes{"Anne"} = 0; # abonné qui a déjà emprunté mais aucun emprunt en cours
    $abonnes{"Michel"} = undef;
     
    while (1){
    print "################## Menu ##################\n";
    print "# #\n";
    print "# 1 - Affichage de la DVDthéque #\n";
    print "# 2 - Ajoute d'un abonné #\n";
    print "# 3 - Suppression d'un abonné #\n";
    print "# 4 - Emprunt de DVD #\n";
    print "# 5 - Retour de DVD #\n";
    print "# 6 - Quitter #\n";
    print "# #\n";
    print "##########################################\n";
    print "choix : ";
    my $choix=<STDIN>;
     
    if ( $choix == 1 ){
    print("\n\nAffichage de la DVDthèque" );
    while (($prenom,$nbDVD) = each %abonnes) {
     print "\n$prenom est abonne";
     # si le nb de DVD n'est pas undef
     if (defined($nbDVD)) {
       print("\n\tnb de DVD empruntes : $nbDVD" );
     } else {
       print("\n\tIl n'a jamais emprunte de DVD" );
     }
    }
    }
    elsif ( $choix == 2 ){
    # Ajout d'un nouvel abonné sans emprunt
    print("\n\nAjout d'un nouvel abonné sans emprunt" );
    print("\nQui souhaitez-vous ajouter ?" );
    $newAbonne =<STDIN>;
    chomp($newAbonne); # suppression du saut de ligne
    $abonnes{"$newAbonne"} = undef; # abonné sans emprunt
    }
    elsif ( $choix == 3 ){
    # Révocation d'un abonné : delete
    print("\n\nQuel User souhaitez vous supprimer?" );
    $user= <>;
    chomp($user);
    delete ($abonnes {$user}) ;
    }
    elsif ( $choix == 4 ){
    # Emprunt d'un ou plusieurs DVD
     
    sub select_a_subscriber {
        my (%hash) = @_;
        my @arr;
        my $n;
        my $select = 0;
        foreach my $key (sort keys %hash) {
            push @arr, $key;
            print ++$n . ". $key\n";                                                                        
        }
        while (($select < 1) || ($select > $n)) {
            print "Sélection (1 à $n) ? \n";
            $select = <>;
            chomp($select);
        }
        return $arr[$select - 1];
    }
    my $ab = select_a_subscriber(%abonnes);
     
    print("\n\nCombien de DVD voulez vous emprunter?" );
     {
     if ($nbDVD > $maxDVD) {
       $DVD = <>;
       $DVD[$i]=$user;
       $i++;
       $emprunteur = $prenom;
       $abonnes{$emprunteur} = $abonnes{$emprunteur} + $n;
     }
    }
    print("\nil a emprunte $DVD DVD" );
    }
     
    elsif ( $choix == 5 ){
    # retour d'un ou plusieurs DVD
     
    sub select_a_subscriber {
        my (%hash) = @_;
        my @arr;
        my $n;
        my $select = 0;
        foreach my $key (sort keys %hash) {
            push @arr, $key;
            print ++$n . ". $key\n";                                                                        
        }
        while (($select < 1) || ($select > $n)) {
            print "Sélection (1 à $n) ? \n";
            $select = <>;
            chomp($select);
        }
        return $arr[$select - 1];
    }
     
    my $ab = select_a_subscriber(%abonnes);
    print"\n\nCombien de DVD voulez vous restituer?";
     {
     if ($nbDVD > $maxDVD) {
       $DVD = <>;
       $DVD[$i]=$user;
       $i--;
       $DVD = $nbDVD;
       $restituer = $prenom;
       $abonnes{$restituer} = $abonnes{$restituer} - $n;
     }
    }
    print ("\nil a restitue $DVD DVD" );
    }
    elsif ( $choix == 6 ){
    exit 0;
    }
    else{
    print "Votre choix n'est pas dans ceux proposes\n";
    }
    }

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Pas tout fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ perl -E 'use strict; use warnings; print $a'
    Name "main::a" used only once: possible typo at -e line 1.
    Use of uninitialized value $a in print at -e line 1.
     
    philou67430@localhost //home/philou67430
    $ perl -E 'use strict; use warnings; my $a; print $a'
    Use of uninitialized value $a in print at -e line 1.

    OK, je t'accorde que ces deux états sont très proches.
    he ben. C'est pas facile l'englich.
    Je m'attarderais bien sur cet aspect de la linguistique, mais je ne voudrais pas polluer ce fil passionnant.

  8. #28
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Personnellement, j'emploierais plutôt le terme déclarer (variable déclarée, par exemple avec my, ou non déclarée) pour dire qu'une variable existe ou non, que l'on a dit au programme que l'on allait sans doute s'en servir, et indifféremment les termes définir ou initialiser pour lui donner une valeur. En anglais, une variable undef renvoie le message Use of uninitialized value si l'on cherche à s'en servir.

    Il est vrai qu'une variable non déclarée renvoie le même message, mais une variable non-déclarée n'est pas la force des choses pas non plus définie (ni initialisée), ce qui fait que le message Use of uninitialized value est aussi correct pour une variable non-déclarée.

  9. #29
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Services de proximité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 5
    Points
    5
    Par défaut Undef no problem
    Citation Envoyé par Lolo78 Voir le message
    Personnellement, j'emploierais plutôt le terme déclarer (variable déclarée, par exemple avec my, ou non déclarée) pour dire qu'une variable existe ou non, que l'on a dit au programme que l'on allait sans doute s'en servir, et indifféremment les termes définir ou initialiser pour lui donner une valeur. En anglais, une variable undef renvoie le message Use of uninitialized value si l'on cherche à s'en servir.

    Il est vrai qu'une variable non déclarée renvoie le même message, mais une variable non-déclarée n'est pas la force des choses pas non plus définie (ni initialisée), ce qui fait que le message Use of uninitialized value est aussi correct pour une variable non-déclarée.
    Je pense qu'une variable undef ne pose pas de soucis dans un code bien structuré. Undef ne veut pas dire 0.

  10. #30
    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
    Citation Envoyé par laisskamal Voir le message
    Je pense qu'une variable undef ne pose pas de soucis dans un code bien structuré. Undef ne veut pas dire 0.
    Bien sûr, une variable undef bien utilisée est très utile. Mais utilisée dans un contexte qui n'accepte pas la valeur undef, ça génère les exceptions dynamiques que tu as.
    Certains opérateurs savent traiter des variables "undef", notamment "defined", "//", ...
    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

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    .
    Certains opérateurs savent traiter des variables "undef", notamment "defined"
    qui vérifie si une valeur est définie ou non ...

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Services de proximité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 5
    Points
    5
    Par défaut Problème résolu
    Citation Envoyé par vidici Voir le message
    qui vérifie si une valeur est définie ou non ...
    J'ai réussi à résoudre mon problème difficilement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. problème sur des table temporaire
    Par xavier81 dans le forum Développement
    Réponses: 16
    Dernier message: 15/02/2011, 01h42
  2. Problème sur des tables
    Par seanbean dans le forum Oracle
    Réponses: 2
    Dernier message: 23/12/2010, 17h38
  3. Problème sur ALTER TABLE ADD (colonne)
    Par gafa5265 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/03/2009, 22h32
  4. Problème de pointeur sur une table de hashage
    Par nicdesf dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2006, 19h23
  5. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06

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