OVH Cloud OVH Cloud

Hashage de Hashage

4 réponses
Avatar
TEXTORIS Julien
Bonjour,

Suite à la réponse de Klaus pour la taille en mémoire d'une matrice dont
toutes les cases ne sont pas utilisés, j'ai suivi son conseil d'utiliser
un hashage de hashage. Mais je pense qu'il y a quelque chose que je ne
maîtrise pas.

je génére mon HoH ainsi :

sub create_inter_matrx {

my($line,@mbr);

print("création de la matrice\n");

while ($line = <INTER>) {
chomp($line);
@mbr = split(/\s/,$line);
$Main::Inter_matrix{$mbr[0]}{$mbr[1]} = "T";
$Main::Inter_matrix{$mbr[0]}{$mbr[0]} = 0;
$Main::Inter_matrix{$mbr[1]}{$mbr[1]} = 0;
$Main::Inter_test{$mbr[0]}{$mbr[1]} = "T";
$Main::Inter_test{$mbr[0]}{$mbr[0]} = 0;
$Main::Inter_test{$mbr[1]}{$mbr[1]} = 0;
}

}

et dans une fonction suivante, quand j'essaie d'afficher les valeur ou
de faire un test, les boucles foreach sont ignorées ? (je sors de la
fonction cross(), mais comme la boucle ne s'est pas executé, le
programme plante).

sub cross {
my($nd,$cpt) = @_;
@Main::found_nodes = ();

print("Entré dans cross - ");

#boucle rajouté pour tester l'erreur (sans succès)
foreach my $key1 (keys %Main::Inter_test) {
foreach my $key2 (keys %{$Main::Inter_test{$key1}}) {
print("\nValeur à l'intersection de $key1 et $key2 :
$Main::Inter_test{$key1}{$key2}\n");
}
}

\boucle initiale
foreach my $nd2 ( keys %{ $Main::Inter_test{$nd} } ) {
print("\n$nd2 - $nd\n");
if ($Main::Inter_test{$nd2}{$nd} eq "T" || $Main::Inter_test{$nd2}{$nd}
<= $cpt) {
$Main::Inter_test{$nd2}{$nd} = $cpt;
print("\nvertical\n");
}
if ($Main::Inter_test{$nd}{$nd2} eq "T" || $Main::Inter_test{$nd}{$nd2}
<= $cpt+1) {
$Main::Inter_test{$nd}{$nd2} = $cpt+1;
$Main::found_nodes[++$#Main::found_nodes] = $nd2;
print("\nhorizontal\n");
}

}
}


Je ne vois pas où est l'erreur de syntaxe dans ces boucles ? pour
l'affichage de %Inter_test, j'ai repris la syntaxe donnée dans la doc
(http://perl.enstimac.fr/DocFr/perldsc.html#hachages%20de%20hachages) :

foreach $family ( keys %HoH ) {
print "$family: { ";
for $role ( keys %{ $HoH{$family} } ) {
print "$role=$HoH{$family}{$role} ";
}
print "}\n";
}


Si vous pouviez m'éclairer ? Merci

julien

4 réponses

Avatar
damien guerin
Salut,

tu devrais mettre un print dans le while de create_inter_matrx pour
voir si tu y rentre bien.
Sinon, je comprends pas vraiment ce que doit faire create_inter_matrx?
Avatar
TEXTORIS Julien
damien guerin wrote:
Salut,

tu devrais mettre un print dans le while de create_inter_matrx pour
voir si tu y rentre bien.
Sinon, je comprends pas vraiment ce que doit faire create_inter_matrx?

Bravo et merci ! ct là l'erreur, en rajoutant close(INTER); open(INTER ...

ça marche. Quel idiot !

Pour la seconde question, la matrice contient les informations d'un
graph. Quand le noeud A est relié à C, Inter_test{A}{C} = "T". Je m'en
sert après pour parcourir le graph.

Merci

Julien

Avatar
damien guerin
A OK, c pour un graphe, je trouvais ça spécial aussi...! C'est pour
un automate à états finis?
Je sens que tu va bientot nous demander comment vérifier s'il y a des
cycles dans le graphe lol ;)

Bon courage !
Avatar
TEXTORIS Julien
damien guerin wrote:
A OK, c pour un graphe, je trouvais ça spécial aussi...! C'est pour
un automate à états finis?
Je sens que tu va bientot nous demander comment vérifier s'il y a des
cycles dans le graphe lol ;)

Bon courage !

Là j'arrête pour aujourd'hui, mais promis j'essaie de trouver tout seul ;-)


merci en tout cas

Julien