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 :

erreurs de variables non initialisées


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut erreurs de variables non initialisées
    Salut tout le monde !!
    J'essaye de faire un programme qui lit un fichier et le stocke dans une matrice. Ensuite je veux comparer chaque case de la colonne 2 avec toutes les autres cases de la colonne 2. Le problème c'est que j'ai plein d'erreurs de variables non initialisées (en fait la même erreur est répétée plusieurs fois). J'ai essayé de toutes les initialisées mais ça ne marche toujours pas ...
    Voici le programme :
    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
     
    #! /usr/bin/perl -w
    print "Entrez un nom de fichier\n";
    $nom_fichier = <STDIN>;
    chomp $nom_fichier;
    @ARGV = ($nom_fichier);
     
    unless (open (FICHIER,$nom_fichier))
    {
    	print "le fichier $nom_fichier ne peut pas être ouvert\n";
    	exit;
    }
     
    while ($fichier=<>) 
    {
    	@fichier_tmp = split (/\t/,$fichier);
        push @fichier, [ @fichier_tmp ];
    }
     
    # nombre de lignes
    $ligne = scalar(@fichier);
    # estimation du nombre de colonnes basée uniquement sur la 1° ligne
    $colonne = scalar(@{ $fichier[0]} );
     
    print "$ligne\n";
    print "$colonne\n";
    $nb_cdt = 0;
    $somme_CT = 0;
    $i = 0;
    $j = 0;
     
    #La ligne 0 étant un en-tête je n'en tient pas compte
    for ($i=1;$i<=$ligne;$i++)
    {
    	#Je stocke le contenu de différentes cases et j'incrémente le nbre de cdtion
    	$cdt_1 = $fichier[$i][2];
    	$somme_CT = $fichier[$i][6];
    	$nb_cdt = $nb_cdt + 1;
     
    	#cette 2ième boucle sert à comparer la ligne précédente avec toutes les lignes qui suivent
    	for ($j=$i+1;$j<=$ligne;$j++)
    	{
    		$cdt_2 = $fichier[$j][2];
     
    		if ($cdt_2 eq $cdt_1)
    		{
    			$nb_cdt = $nb_cdt + 1;
                            #L'erreur se trouve ici
    			$somme_CT = $somme_CT + $fichier[$j][6];
    		}
    	}	
    }
     
    close FICHIER;
    exit;
    L'erreur que j'obtiens c'est :

    Use of uninitialized value in addition (+) at C:\Documents and Settings\Panel\Bureau\tp_perl\fonctions.pl line 47, <> line 25.

    J'ai aussi une erreur avec la ligne où j'utilise "eq" :

    Use of uninitialized value in string eq at C:\Documents and Settings\Panel\Bureau\tp_perl\fonctions.pl line 44, <> line 25.

    Si vous pouviez m'aider la-dessus aussi ça m'arrangerait !!
    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Tout d'abord, un conseil, déclare tes variables ! Cela t'évitera bien des problèmes...

    Es-tu sûr que $fichier[$i][2] et $fichier[$j][2] existent bien ? Moi je n'en suis pas persuadé... Ton tableau a $ligne élements, et à un moment tu cherches l'élement $fichier[$ligne]... Déjà c'est pas bon ça (les tableaux commencent à 0, leur dernier indice est donc leur nombre d'élement - 1) ! Il y a au moins une erreur à ce niveau.

    Corrige et dit nous ce qu'il en est
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bonsoir Woufeil,
    tout d'abord, qu'est-ce que tu veux dire par "déclarer mes variables" ?? Quand je les utilise pour stocker des données je les déclare non ?? J'avais l'habitude de déclarer des variables en langage C (vu que c'était obligatoire) mais je croyais qu'en Perl c'était pas utile ??
    Ensuite pour tester si $fichier[$i][2] et $fichier[$j][2] existent j'ai un peu changé mon programme pour juste afficher ce qu'il y a dedans et en changeant les signes "<=" par des "<" tout court ça m'affiche bien ce qu'il faut donc je suppose que ça veut dire qu'elle existent bien, non ??
    Et j'ai beau chercher dans mon programme (qui n'est pourtant pas bien long), je n'accède jamais à une case de la matrice en passant par l'instruction $fichier[$ligne] vu k'il faut une ligne et une colonne ... C'est vrai qu'en passant par les variables $i et $j ça revient un peu au même vu qu'elles prennent la valeur de $ligne, mais comme je commence le comptage des boucles for à 1 ou + je pensais que je pouvais mettre comme condition d'arrêt "$i<=$ligne" au lieu de "$i<$ligne" quand on commence à 0 ... Mais le test que j'ai fait montre que c'est bien un signe "<" qu'il faut mettre.
    Je ne sais pas si tu as compris ce que j'ai voulu dire, mais j'ai fait de mon mieux !!

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    setsuko974, il est toujours utile de déclarer ses variables ! Même si tu n'es pas obligé de le faire, cela vaut toujours mieux.
    Imagine que tu fasses une faute de frappe dans l'une de tes variables, lors d'une affectation par exemple, c'est un coup à passer des heures de débugage pour rien ça ! C'est juste un conseil que je te donne, ça n'a rien à voir avec ce programme, je le précise. Renseigne-toi sur l'instruction my et sur me pragma strict, dans la FAQ Perl par exemple. Si tu veux encore plus de détails sur Perl en général, je te conseille l'excellent tutoriel de Sylvain Lhullier

    Sinon, dans ta boucle for, tu fais aller i de 0 à $ligne inclus. Ligne est égal à scalar(@fichier), à savoir le nombre d'élements de ton tableau.
    Dans dans le code de la boucle, tu utlises bien $fichier[$i][2] . Daus au bout d'un moment, tu accéderas bien à $fichier[$ligne][2]. Pour que cet élement existe, il faut forcément que $fichier[$ligne] existe (c'est en réalité une référence, donc un scalaire, mais ça n'a aucune importance ici, tu peux le voir comme un tableau si tu veux). Or ça ne peut pas être le cas !
    Le dernier élement de ton tableau est $#fichier ou $fichier(scalar(@fichier) - 1). Fait un test avec exists pour t'en convaincre.

    Au final, en remplaçant tes <= par des <, le programme fonctionne ou pas ?

    Enfin, simple curiosité, d'où te viens cette idée de modifier @ARGV pour y ajouter ton fichier ? Si tu veux lire ton fichier, utilise <nom_fichier> plutôt que de modifier @ARGV puis d'utiliser <>, c'est plus propre

    Valà, bon courage !
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bonjour,
    le changement de "<=" par "<" dans le programme que j'ai posté ne change rien à mon problème.
    Et je ne commence jamais le comptage des boucles for à 0 mais à 1 dans la première boucle et à i+1 dans la 2ième.
    Et pour l'histoire du @ARGV j'avais essayer de plusieurs façons en m'inspirant de tutoriels comme ça marchait pas j'ai bidouillé et comme ça marche de cette façon, ben j'ai laissé ça comme ça.
    Je vais me plonger dans le tutoriel et la FAQ avant de poser d'autres questions.

Discussions similaires

  1. erreur compilation: variable non défini
    Par ngouagme dans le forum Langage
    Réponses: 8
    Dernier message: 07/07/2010, 15h38
  2. [AC-2003] Erreur de variable non définie
    Par piercleo dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/01/2010, 16h02
  3. Variables non initialisées ?
    Par Phonatacid dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/02/2009, 18h25
  4. Erreur en utilisation non-initialiser motif
    Par moniphal dans le forum Langage
    Réponses: 2
    Dernier message: 30/09/2005, 13h03
  5. Réponses: 1
    Dernier message: 19/08/2005, 12h33

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