Langage C: Exception en point flottant

enacien -  
 viruk -
Bonjour,

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;
}


A voir également:

4 réponses

le père
 
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.
3
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
modulo fait une division ?? faut dire, je ne sais pas comment fonctionne cette fonction exactement.
0
le père
 
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
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
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.
0
viruk
 
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
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
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).
0
le père
 
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.
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Le debugueur c'est tout de même plus efficace !
"exception en point flottant" ça ne pas dire SIGSEG en windows ?
0
le père
 
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é.
0
viruk
 
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é!
0