voici mon code:
je l'explique un peu: c'est un partie de programme visant à faire de l'ascii_art.
le problème se situe à la fin de choix_chara: lorsque je lance le programme cela me met un "Exception en point flottant" mais lorsque que je remplace e=choix(l) par une valeur fixe, cela fonctionne.
une ou deux précisions utiles: l est une liste structurée, j'ai bien inclus toutes les librairies nécessaires, initialisé le timeur plus haut pour la fonction random...
je ne comprends pas cette erreur.
Avez-vous une idée?
char choix_chara(int niv_gris_moy, int max, int min,charactere* tableau,int taille_tableau){
double k=signature_pixel_2(niv_gris_moy,max,min);
liste l= vide;
int i;
double acc=1;
int min2=plus_petit_tab(tableau,taille_tableau);
int max2=plus_grand_tab(tableau,taille_tableau);
for (i=0;i<94;i++){
double k2=signature_charascii_2((tableau[i]->nv_gris),max2,min2);
if(acc< abs(k2-k)){
acc=abs(k2-k);
l=vide;
cons(i,l);
}
else if(acc==abs(k2-k)){
cons(i,l);
}
}
int e=choix(l);
return tableau[e]->lettre_ascii;
}
}
int take_from_liste(int k,liste l){
if (k>longueur_liste(l)){printf("erreur");exit(1);}
else if (k==0){return(l->head);}
else{return (take_from_liste(k-1,l->tail));}
}
int choix( liste l){
int i=longueur_liste(l);
int k = (rand()% i) ;
int j=take_from_liste(k,l);
return j;
}
Autre remarque : quand ta liste est vide, int k = (rand()% i) ; fait une division par zéro.
Ce n'est pas a priori une erreur de virgule flottante, mais ça peut sûrement te faire planter.
Char Snipeur
Messages postés9813Date d'inscriptionvendredi 23 avril 2004StatutContributeurDernière intervention 3 octobre 20231 298 25 avril 2012 à 10:50
modulo fait une division ?? faut dire, je ne sais pas comment fonctionne cette fonction exactement.
Quand tu fais une division, tu obtiens deux résultats, le quotient et le reste.
Dans la division au sens habituel, on s'intéresse au quotient.
Dans le modulo, on s'intéresse au reste.
Mais c'est fondamentalement la même opération, et prendre un modulo 0 est mathématiquement aussi absurde que de diviser par 0
Char Snipeur
Messages postés9813Date d'inscriptionvendredi 23 avril 2004StatutContributeurDernière intervention 3 octobre 20231 298 25 avril 2012 à 08:58
Ton erreur signifie que tu va dans un espace mémoire qui ne t'appartient pas.
tu as cibler ton problème, il vient de choix. Il est possible que ta liste soit mal définie ou que la longueur qu'elle retourne soit fausse.
je suis sûr de ces fonctions vu que je les ai déja testées... et en fait, choix fonctionne aussi lorsque je l'utilise seul... j'ai passé du temps sur la question et je n'ai pas trouvédonc je ne pense pas que ce soit aussi "trivial", à moins qu'il me faille des lunettes =)
ps: malgré le changement de pseudo je suis bien l'auteur du sujet
Char Snipeur
Messages postés9813Date d'inscriptionvendredi 23 avril 2004StatutContributeurDernière intervention 3 octobre 20231 298 25 avril 2012 à 10:14
utilise le debugueur à ce moment là.
mais si en modifiant "int e=choix(l);" par "int e=2;" il n'y a plus d'erreur, soit ta fonction est en cause (un cas auquel tu n'as pas pensé) soit "l" est mal défini (longueur fausse ou valeur nulle).
Bonjour
Ce qui m'intrique, c'est qu'il s'agisse d'une erreur de virgule flottante, alors qu'il n'est pas question de virgule flottante dans choix ni dans la fin de la fonction choix_chara qui appelle choix.
Tu n'as pas moyen de détecter quelle est vraiment la ligne qui provoque l'erreur ?
En mettant quelques "printf ('coucou')" pour voir où tu passes et où tu ne passes plus.
Char Snipeur
Messages postés9813Date d'inscriptionvendredi 23 avril 2004StatutContributeurDernière intervention 3 octobre 20231 298 25 avril 2012 à 10:48
Le debugueur c'est tout de même plus efficace !
"exception en point flottant" ça ne pas dire SIGSEG en windows ?
Le debugueur c'est tout de même plus efficace ! Honte à moi, tu as raison à 200%, évidemment...
Je prends de mauvaise habitudes avec le PHP (bien qu'il existe des possibilités de débogage aussi paraît-il, mais je ne me suis jamais penché dessus)
exception en point flottant Je me suis permis de supposer que c'était une (mauvaise) traduction de floating point exception, qui signifie en principe un problème de calcul en virgule flottante. Mais les messages d'erreur ne correspondent pas toujours à la réalité.
oui en effet c'est la qu'est l'erreur, je me suis trompé dans l'algorithme (un < est devenu >) ce qui fait que la liste restait vide, d'où le modulo 0 et l'erreur.
merci pour votre aide, ca m'a bien aidé!
25 avril 2012 à 10:50
Modifié par le père le 25/04/2012 à 11:22
Dans la division au sens habituel, on s'intéresse au quotient.
Dans le modulo, on s'intéresse au reste.
Mais c'est fondamentalement la même opération, et prendre un modulo 0 est mathématiquement aussi absurde que de diviser par 0