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
| float Calcule::calcule_dis(float **data){
// On a appelé C->calcule_dis(data)
// Le paramètre formel "data" est une copie du paramètre effectif "data" (celui de "C->calcule_dis(data)")
// qui est une variable globale du module qui définit "main()".
// Comme cette variable globale n'était pas initialisée, elle contient une valeur indéterminée
// et produira probablement un crash du programme.
// A part ça, comme le paramètre formel de cette fonction s'appelle "data",
// alors "data" ne correspond pas à "Calcule::data", mais au paramètre formel de la fonction.
float ** dist = new float* [nbl];
for (int i=0; i < nbl; i++)
dist[i] = new float [ nbc ];
// Dans les lignes ci-dessus, on crée une variable "dist" locale à cette fonction
// qui n'a rien à voir avec la variable globale "dist" du module qui définit "main()".
// On alloue nbl tableaux de taille nbc. "dist" représente alors une matrice.
for( int i=0;i<nbl;i++ ){
for (int j=0; j<nbl ; j++){
for (int k=0; k <nbc; k++){
dist[i][j]=(float)pow(data[i][k]-data[j][k], 2 );
// La ligne ci-dessus suppose que dist a nbl lignes et nbl colonnes
// (faux : dist a nbc colonnes)
// et que data a nbl lignes et nbc colonnes.
}
// Dans la boucle ci-dessus, on écrit nbc fois dans dist[i][j], donc
// c'est la dernière itération qui détermine la valeur de dist[i][j].
// S'il n'y avait pas eu de crash, le code précédent équivalait à :
// dist[i][j]=(float)pow(data[i][nbc-1]-data[j][nbc-1], 2 );
}
}
for( int i=0;i<nbl;i++ ){
for (int j=0; j<nbl ; j++){
return dist[i][j]= sqrt(dist[i][j]);
// A la première itération, on remplace dist[0][0] par sa racine carrée.
// Ensuite, on retourne le contenu de dist[0][0].
// Au final, c'est comme si on avait retourné
// sqrt((float)pow(data[0][nbc-1]-data[0][nbc-1], 2 ))
// c'est à dire 0.
// Comme on a utilisé "return", les itérations suivantes ne seront jamais exécutées.
}
}
// Le contenu de la matrice dist n'a pas été libéré donc, en plus, on a une fuite mémoire.
} |
Partager