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 :

Use of uninitialized value $valhier in string at


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut Use of uninitialized value $valhier in string at
    Bonjour,

    Je débute en Perl, et je voulais faire un petit script pour me générer un fichier.
    J'ai l'erreur suivante à l'execution : Use of uninitialized value $valhier in string at line (voir ligne correspondante en gras)

    Voici le 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
    my $i = 0;
    my $tab_auj;
    my $tab_hier;
    my $time;
    my $val;
    my $valhier;
    my $fileCSV;
    my @tab_auj= ();
    my @tab_hier= ();
    my @result= ();
    
    
    # Run the main loop
    &genere;
    
    # ========== generer fichier xml pour datas temperature THGN800 ===============
    sub genere {
    	
    # Requete pour les résultats du jour
    	my $requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -25 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    	my $sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_auj[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
    	
    	
    # Requete pour les résultats de la veille
    
    	$requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    	$sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_hier[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
    	
    	use FileHandle;
    
    	my $fileXML="/volume1/web/meteo/graph_THGN800_1_temp/datas.XML";
    	open (F, ">$fileXML");
    	print F "chart_data: ";#pour écrire dans le fichier
    
    
    	for $i (0 .. ($#tab_auj)) {
    			$time = $tab_auj[$i]->{timestamp_mesure};
    			$val = $tab_auj[$i]->{valeur_mesure};
    			$valhier = $tab_hier[$i]->{valeur_mesure};
    			print F "$time";
    			print F ";";
    			print F "$val";
    			print F ";";
    			print F "$valhier";
    			print F ";";
    	}
    	
    	print F ",\n";
    
    	close F;#fermeture du fichier.
    
    print "Fin du script\n\n";
    }
    J'ai déclaré et initialisé mes variables. J'ai beau chercher, je ne trouve pas.
    Merci pour votre aide.
    Mikael

  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
    Avant de regarder plus loin, merci d'ajouter en début de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use strict;
    use warnings;
    Si tu souhaites encore de l'aide, il faudra fournir le contenu du fichier /volume1/web/meteo/graph_THGN800_1_temp/datas.XML
    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 régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Effectivement je n'avais pas mis le début du fichier dans mon quote.

    Je remet le fichier complet :
    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
     
    #!/opt/bin/perl -w
     eval 'exec /opt/bin/perl -w -S $0 ${1+"$@"}'
         if 0; # not running under some shell
     
    =head1 NAME
     
     genere_xml_meteo - Perl script to generate xml datas files for website charts
     
     
    =head1 DESCRIPTION
     
    Perl script to generate xml datas files for website charts
     
    =cut
    use strict;
    use warnings;
     
    use DBI;
    my $DB = "xxxx";
    my $HOST = "xxxx";
    my $LOGIN = "xxxx";
    my $PWD = "xxxx";
    my $dbh = DBI->connect("dbi:mysql:dbname=$DB;host=$HOST;",$LOGIN,$PWD) or die "Connexion impossible\n";
    $|=1; # autoflush helps debugging
     
    my $i = 0;
    my $tab_auj;
    my $tab_hier;
    my $time;
    my $val;
    my $valhier;
    my $fileCSV;
    my @tab_auj= ();
    my @tab_hier= ();
    my @result= ();
     
     
    # Run the main loop
    &genere;
     
    # ========== generer fichier xml pour datas temperature THGN800 ===============
    sub genere {
     
    # Requete pour les résultats du jour
    	my $requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -25 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    	my $sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_auj[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
     
     
    # Requete pour les résultats de la veille
     
    	$requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    	$sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_hier[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
     
    	use FileHandle;
     
    	my $fileXML="/volume1/web/meteo/graph_THGN800_1_temp/datas.XML";
    	open (F, ">$fileXML");
    	print F "chart_data: ";#pour écrire dans le fichier
     
     
    	for $i (0 .. ($#tab_auj)) {
    			$time = $tab_auj[$i]->{timestamp_mesure};
    			$val = $tab_auj[$i]->{valeur_mesure};
    			$valhier = $tab_hier[$i]->{valeur_mesure};
    			print F "$time";
    			print F ";";
    			print F "$val";
    			print F ";";
    			print F "$valhier";
    			print F ";";
    	}
     
    	print F ",\n";
     
    	close F;#fermeture du fichier.
     
    print "Fin du script\n\n";
    }
    Concernant le fichier XML : /volume1/web/meteo/graph_THGN800_1_temp/datas.XML. C'est un fichier qui est vide, ou qui n'existe pas, et que ce script génère.
    L'interet de ce script est de generer un fichier de données, qui sera sans doute du csv par la suite (mais seule l'extension sera à changer). Les datas contenue dans ce fichier seront extraites de ma BDD.

    Merci.

  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
    Ahem, ok, j'ai lu un peu rapidement.

    Cela dit, je ne pense pas que la ligne avec l'erreur soit celle en gras, mais plutôt celle-ci :
    $valhier est initialisé à partir du tableau @tab_hier. Ce tableau est initialisé à partir de la requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    Avez-vous vérifié que cette requète retourne autant d'éléments que la requète qui rempli @tab_auj ?
    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 régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Merci pour la réponse,

    La ligne d'erreur correspond bien à celle que tu dis.

    Effectivement, il est sur qu'il n'y a pas le même nombre d'enregistrements retournés pour les deux mêmes requêtes.
    A raison de 1 enregistrement tous les 1/4h, si je mets dans mes deux requetes un DESC LIMIT 96, cela fonctionnera ?
    Le problème est du au nombre d'enregistrements qui n'est pas identique ?

    J'ai testé avec le DESC LIMIT 96, erreur idem :
    Use of uninitialized value $valhier in string at /opt/bin/genere_xml_mete line 82.

  6. #6
    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 ne comprends pas ce que fais ton script (et je ne chercher pas à le faire), mais je constate simplement que dans ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for $i (0 .. ($#tab_auj)) {
    ton indice $i varie de 0 jusqu'au dernier élément du tableau @tab_auj
    et tu utilises ce même indice pour deréférencer le tableau @tab_hier.

    Il suffit donc que le tableau @tab_hier ne contiennent pas le même nombre d'élément que le tableau @tab_auj pour que le bug apparaisse (l'erreur d'initialisation).
    Cela dit, même si les tableaux sont de même taille, il reste que les données des deux tableaux doivent être "cohérentes entre elles pour l'usage que tu veux en faire", et ça, pour chaque valeur de l'indice $i.
    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

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Bonjour Philou67430,

    Actuellement j'ai des capteurs météo, qui envoie un messages X10 (sans fil) dès que la valeur change.
    Je réceptionne ce signal avec un "contrôleur domotique", qui ensuite le transforme en message xPL, qu'il diffuse sur mon réseau local.
    Je fais tourner sur mon NAS Synology un script qui enregistre toutes les messages xPL, dans une base de données PhpMyAdmin.

    Ensuite je veux faire tourner ce script, qui me générera pour chaque capteur un fichier de données, qui se présente sous la forme suivante :

    chart_data :" 20120315120020; 15.6; 12.3, 201203151215020; 15.7; 12.4,[...],"
    le 20120315120020 correspond au timestamp de la mesure d'aujourd'hui
    le 15.6 à la valeur d'aujourd'hui
    le 12.3 à la valeur d'hier.

    Ensuite j'ai une page web qui utilise cette ligne de données pour m'afficher le graphique correspondant. Car au début je générais cette ligne en php, mais il est devenu impossible de le faire à cause du nombre d'enregistrement de ma base. Le chargement de la page est trop long.

    Effectivement, je fais une boucle qui parcours les ligne de mon tableau $tab_auj de 0 à la dernière ligne. Je récupère le timestamp et la valeur pour aujourd'hui. Dans cette même boucle, je veux récupérer aussi la valeur pour hier qui correspond à la même ligne du tableau.
    Car à raison de une données tous les 1/4 heure. Les timestamp entre aujourd'hui et hier correspondent à peu près.

    Si mon tableau $tab_auj contient 100 lignes, alors je ne veux prendre que les 100 premières lignes de mon tableau $tab_hier.

    Est-ce que mon explication est claire ? Tu verras mieux ou je veux en venir.

    Merci.

  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
    Tes explications sont à peu près claires, mais l'erreur que ton script révèle vient du fait qu'à certains éléments du tableau @tab_auj pour l'indice $i, il n'y a aucune valeur correspondante dans le tableau @tab_hier au même indice.

    Pour confirmer, passe en mode debug (perl -d script.pl) et relève le numéro de cette ligne
    (disons que ce numéro soit 82).
    Ensuite, place le breakpoint suivant :
    puis lance l'exécution
    Après l'arrêt au breakpoint, visualise les variables $i, @tab_auj et @tab_hier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x $i, @tab_auj, @tab_hier
    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 régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Voilà le résultat de ce que tu m'as demandé. On ne voit pas la variable $valhier.

    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
     
    Synology> perl -d /opt/bin/genere_datas_meteo
     
    Loading DB routines from perl5db.pl version 1.28
    Editor support available.
     
    Enter h or `h h' for help, or `man perldebug' for more help.
     
    main::(/opt/bin/genere_datas_meteo:2):
    2:       eval 'exec /opt/bin/perl -w -S $0 ${1+"$@"}'
    3:           if 0; # not running under some shell
      DB<1> b 98 !defined $valhier
      DB<2> c
     
    main::temp_THGN800_1(/opt/bin/genere_datas_meteo:98):
    98:                             print F "$valhier";
      DB<2> x $i, @tab_auj, @tab_hier
    [...extrait...]
    314  HASH(0x4cdf14)
       'timestamp_mesure' => 20120314181508
       'valeur_mesure' => 13.7
    315  HASH(0x4cdf44)
       'timestamp_mesure' => 20120314183009
       'valeur_mesure' => 13.1
    316  HASH(0x4cdf74)
       'timestamp_mesure' => 20120314184510
       'valeur_mesure' => 12.5
    317  HASH(0x4cdfa4)
       'timestamp_mesure' => 20120314190011
       'valeur_mesure' => 12.1
    318  HASH(0x4cdfd4)
       'timestamp_mesure' => 20120314191512
       'valeur_mesure' => 11.4
      DB<3> q

  10. #10
    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
    Il faut absolument voir $i, et comme les tableaux sont grands, tu peux visualiser leur taille au lieu de leur contenu.
    Une fois arrêté, tu demandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x $i, scalar(@tab_auj), scalar(@tab_hier)
    Si $i > scalar(@tab_hier), c'est que @tab_hier ne contient pas assez de données. Mais pour cela, je ne peux rien faire, c'est soit ta requète qui n'est pas complète, soit ta base de donnée qui ne contient pas suffisamment de données pour la requète.
    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. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Voilà ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     DB<2> x $i, scalar(@tab_auj), scalar(@tab_hier)
    0  0
    1  105
    2  215
    Quand je fais ça en php, cela fonctionne. De toutes façons si tab_hier est supérieur à tab_auj, il y a donc forcement une valeur correspondante de tab_hier pour chaque tab_auj.


    Autre petite question : Je veux faire une boucle qui execute le script continuellement. J'ai regardé avec MainLoop() (http://perl.developpez.com/faq/tk/?p...erlTk#MainLoop) mais je ne comprends pas le fonctionnement.
    Quand je mets juste MainLoop(); avant mes sub, il execute une fois le script et après me met une erreur.

  12. #12
    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
    Etrange, et que donne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x $i, $tab_auj[$i], $tab_hier[$i]
    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

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      DB<2> x $i, $tab_auj[$i], $tab_hier[$i]
    0  0
    1  HASH(0x2545a8)
       'timestamp_mesure' => 20120314203017
       'valeur_mesure' => 9.3
    2  HASH(0x4ce10c)
         empty hash

  14. #14
    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 fait, l'élément $i (0) de @tab_hier existe, mais sa valeur est undef...

    Il faut aller voir comment $tab_hier est initialisé.
    A priori, ce sera demain
    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

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Est-ce que cette initialisation est bonne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my $i = 0;
    my $tab_auj;
    my $tab_hier;
    my $time;
    my $val;
    my $valhier;
    my $fileCSV;
    my @tab_auj= ();
    my @tab_hier= ();
    my @result= ();
    Bonne soirée

  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
    Le problème ne vient pas de cette initialisation, mais du remplissage du tableau @tab_hier, donc de cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	$requete = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE id_capteur='20' AND type_mesure='temp' AND timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -50 HOUR) AND DATE_ADD(NOW(),INTERVAL -25 HOUR) ORDER BY timestamp_mesure DESC";
    	$sth = $dbh->prepare($requete);
    	$sth->execute() or die "Echec Requete $requete : $DBI::errstr\n";
    	while (my @result = $sth->fetchrow_array()) {
    		$tab_hier[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    	}
    	$sth->finish();
    en fait, je crois que j'ai compris : $i n'est pas ré-initialisé entre le remplissage de @tab_auj et @tab_hier.

    Ceci m'amène à vous conseiller de préférer l'usage de la fonction push au lieu d'initialiser une élément de tableau par son indice. Cela a plusieurs avantages : aucun risque de créer des éléments vides à cause d'une mauvais gestion du compteur d'indice, et plus besoin de gérer l'indice (et en plus, c'est exactement fait pour).

    Dans vos deux boucles, modifiez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		$tab_auj[$i] = { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    		$i ++;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		push @tab_auj, { timestamp_mesure => $result[0], valeur_mesure => $result[1] };
    (idem avec @tab_hier au lieu de @tab_auj).
    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 régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Points : 104
    Points
    104
    Par défaut
    Philou

    Cela fonctionne avec la méthode push...

    Par contre je veux bien que tu me réexplique la différence entre push et ce que j'avais fais ?
    Push signifie que à chaque valeur qu'il trouve il incrémente le tableau sans se soucier du numéro d'ndice, il met tout à la suite ?

  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
    Citation Envoyé par mikael2235 Voir le message
    Par contre je veux bien que tu me réexplique la différence entre push et ce que j'avais fais ?
    Push signifie que à chaque valeur qu'il trouve il incrémente le tableau sans se soucier du numéro d'ndice, il met tout à la suite ?
    Oui, c'est cela, et c'est aussi la méthode à privilégier pour alimenter une table. En effet, si tu alimentes le tableau en accédant directement aux indices et en les incrémentant toi même, tu as toujours le risque de "mal gérer" cet indice, et de créer ainsi, des trous dans le tableau. C'est exactement ce qui s'est passé dans ton cas : lorsque tu as commencé à remplir le tableau @tab_hier, tu n'as pas ré-initialisé le tableau à 0. Du coup, $i valait la taille du tableau @tab_auj. Ton premier élément de @tab_hier s'est donc trouvé placé à scalar(@tab_auj) au lieu de l'indice 0.
    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

Discussions similaires

  1. Use of uninitialized value in string
    Par lokomass dans le forum Programmation et administration système
    Réponses: 10
    Dernier message: 25/04/2013, 15h19
  2. Use of uninitialized value in concatenation (.) or string
    Par pontarose dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2011, 13h26
  3. Use of uninitialized value $code_retour in string ne at
    Par cbassti1 dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2010, 22h16
  4. Use of uninitialized value in string ne at
    Par Gad29 dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 09/05/2007, 13h49
  5. [langage] Use of uninitialized value
    Par Batou dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2005, 10h28

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