Langage C: Exception en point flottant

Fermé
enacien - 25 avril 2012 à 04:37
 viruk - 25 avril 2012 à 12:36
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;
}


4 réponses

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 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 330
25 avril 2012 à 10:50
modulo fait une division ?? faut dire, je ne sais pas comment fonctionne cette fonction exactement.
0
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