Comment attraper la division entière par zéro exception en langage C?
Il est connu comment attraper le flotteur de la division par zéro, à l'exception de l'utilisation de
signal(SIGFPE, handler)
mais il ne l'attrape pas de division entière par zéro problème, même si j'ai de contrôle d'installation de word avec
_control87(0, _MCW_EM ); (MS VC 2010)
SubQuestion_1: Comment attraper division entière par zéro dans le programme C sous Windows sans l'utilisation de la SEH EXCEPTION_INT_DIVIDE_BY_ZERO? (Sous Unix/Linux, cela peut être fait avec l'utilisation de la norme signal SIGFPE techinque)
EDIT:
le signal est en C ANSI, traitement du signal de l'approche.
_control87 est la fonction standard de Windows pour régler le flotteur mot de contrôle.
Question similaire: Comment gérer toutes les erreurs, y compris à l'intérieur de la bibliothèque C d'erreurs, de manière uniforme
NOTE (à partir de la norme ISO/IEC 9899:TC2 l'Annexe H. 2.2):
"La signé C les types d'entiers de type int, long int, long int, et le correspondant de
unsigned types sont compatibles avec LIA−1. ... C est entier non signé types sont ‘modulo’ dans la LIA−1 sens qui déborde ou hors-limites des résultats silencieusement envelopper. Une mise en œuvre qui définit entier signé de types comme étant aussi modulo n'a pas besoin de détecter le dépassement d'entier, dans ce cas, entiers de division par zéro besoin d'être détecté."
?SOLUTION FINALE:
Pour Windows: il jette SEH exception. De sorte qu'il peut être pris par l'utilisation de __essayer __l'exception.
Comme solution possible SEH traduction pourrait être utilisé pour gérer la SEH exception et de les traduire à l'appel de la fonction. Ce n'est pas une façon "naturelle", mais il semble que c'est le seul moyen.
Pour Unix: c'est peut-être coincé avec signal SIGFPE solution. Ou vérifier wiki pour FPE_INTDIV solution ( http://rosettacode.org/wiki/Detect_division_by_zero#C ).
Comme GMan a raison à propos de "comportement indéfini" je suis le choix de sa réponse comme correcte.
Remarque: Il est intéressant de vérifier CR\crt\src\winxfltr.c: _XcptActTab tableau : )
Ce n'est pas une fonctionnalité du langage C, ce qui ne veut pas avoir des exceptions. C'est une plate-forme spécifique. Veuillez fournir des OS et le compilateur que vous utilisez.
Jens Gustedt: Concernant "-1" - ce sont deux questions différentes. La première était sur le pourquoi du flotteur de division par zéro exception n'a pas évoqué dans le contexte de la fonction appelée. Ce est sur la façon de prendre du integer division par zéro.
double possible de Pourquoi "division par zéro" n'était pas attraper, même _control87 a été appelé?
Goz: non il ne l'est pas. Lire mon commentaire ci-dessus.
OriginalL'auteur outmind | 2010-06-23
Vous devez vous connecter pour publier un commentaire.
Division par zéro conduit à un comportement indéfini, il n'y a pas de C construction du langage qui ne peut rien faire à ce sujet. Votre meilleur pari est de ne pas diviser par zéro dans la première place, en vérifiant le dénominateur.
Si vous voulez "attraper" (remarque, C n'a pas d'exceptions) cette erreur, cela dépend de votre compilateur et de l'OS, vous n'en avez pas dans la liste. Par la voie,
_control87
a qu'à faire avec les opérations à virgule flottante, et rien à voir avec les opérations sur entiers.GMan: C ANSI Standard, 7.6.2 "Exceptions"
Oh, je vois ce que vous dites, je equivocated. Eh bien, malheureusement il n'y a pas de manière standard d'attraper la division par zéro, c'est tout simplement un comportement indéfini. Et votre autre commentaire, c'est exactement ce que nous sommes en train de dire: Vous trouver un OS spécifique de la façon de le faire, le langage C n'a pas de sens.
§6.5.5: Multiplicatif opeators: "le résultat de La
/
opérateur est le quotient de la division du premier opérande par le second; le résultat de la%
opérateur est le reste. Dans les deux cas, si la valeur de la deuxième opérande est égal à zéro, le comportement est indéfini."La norme citation est de moi, mais vous êtes les bienvenus.
OriginalL'auteur GManNickG
Vérifier ce que vous êtes en divisant contre...?
Remarque: En float-point de l'arithmétique et des mathématiques monde, le résultat est "Infini" pas de 0.
En mathématiques, il n'est toujours pas défini. 🙂 Virgule flottante unités ont tendance à aller pour positif ou négatif de l'infini, en fonction du signe des opérandes, comme vous l'avez dit.
C'était une remarque pour éviter les novices utiliser le code dans leurs programmes de w/o d'examen. Je sais que sur les limites de calcul.
salut, il n'y a pas d'autre moyen de piéger les diviser par zéro autrement qu'en mettant 0. par exemple, --> 0 / 0 = ?? La seule chose que vous pouvez faire à la place est de retour 0 à la place... 😐
OriginalL'auteur buttercup