IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Exception de première chance à 0x100e3cf2 dans shervinemami.exe*: 0xC0000094: Integer division by zero.


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Exception de première chance à 0x100e3cf2 dans shervinemami.exe*: 0xC0000094: Integer division by zero.
    Bonjour
    Je suis en train de dévélopper une application en C++ sous Visual Studio 2008 sous Windows XP.Si je veux généer mion code tout va bien
    ==========
    Régénération globale*: 1 a réussi, 0 a échoué, 0 a été ignoré
    ==========
    Mais si je veux éxécuter mode une exception se léve :une alerte s'affiche
    Exception de première chance à 0x100e3cf2 dans xxxxxx.exe*: 0xC0000094: Integer division by zero..
    Y-t-il une explication?Je ne vois un entier nul qu'on a divisé par.
    Si vous voulez je vous enverrai le code!!
    Merci de m'aider

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    si tu utilises visual, passe en debug et arrête-toi où et quand ça pète.
    Si tu as une exception "division by 0" c'est que tu divises par 0 quelque part obviously !
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bonjour,

    si tu utilises visual, passe en debug et arrête-toi où et quand ça pète.
    Si tu as une exception "division by 0" c'est que tu divises par 0 quelque part obviously !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    47
    48
    49
    50
    IplImage* Leila::cropFace(IplImage*image, CvPoint eye_left, CvPoint eye_right, double offset_pct[2], CvSize dest_sz)
    {
    	//calculate offsets in original image
       double offset_h = offset_pct[0]* dest_sz.width;
     double offset_v = offset_pct[1]*dest_sz.height;
       //get the direction
    double   eye_directionX,eye_directionY;
    eye_directionX= double(eye_right.x - eye_left.x);
    eye_directionY=double(eye_right.y - eye_left.y);
     
     double rotation;
    rotation =  double(-atan2(eye_directionY,eye_directionX )*180/PI);
     // distance between them
     
       double dist = distancePoints(eye_left, eye_right);
       //calculate the reference eye-width
       double reference = dest_sz.width - 2.0*offset_h;
      //scale factor
       double scale = dist/reference;
       //rotation par rapport à l'oeil gauche
       //matrice de rotation
       cv::Mat affine_matrix;
      affine_matrix =cv::getRotationMatrix2D( eye_left, rotation, scale );
      //mtx est la conversion de image IplImage* en matrice mtx
      cv::Mat mtx=cv::Mat(image,true); 
    	 cv::Mat mtx2;
    	 cv::warpAffine(mtx, mtx2, affine_matrix,mtx.size(),cv::INTER_LINEAR, cv::BORDER_CONSTANT,cv::Scalar::all(255));
    	  //mtx est la conversion de matrice mtx2 en  image IplImage* 
     
    	 IplImage image1 =mtx2;
    	 IplImage* im22=(IplImage*)&image1;
    //crop the rotated image
       double crop_x =double(eye_left.x) - scale*offset_h;
     double crop_y =double(eye_left.y) - scale*offset_v;
     
    	 double crop_size0 = (double)dest_sz.width*scale;
    	  double crop_size1= (double)  dest_sz.height*scale;
    CvRect region;
    region.x=cvRound(crop_x);
    region.y=cvRound(crop_y);
    region.width=cvRound (crop_size0);
    region.height=cvRound(crop_size1);
     
     IplImage* im44=cropImage(im22,region);
     //crop((int(crop_xy[0]), int(crop_xy[1]), int(crop_xy[0]+crop_size[0]), int(crop_xy[1]+crop_size[1])))
     // # resize it
     // image = image.resize(dest_sz, Image.ANTIALIAS)
    IplImage* image3=resizeImage(im44, dest_sz.width, dest_sz.width);
    return image3;
    }

    je fais l'appel de cette fonction IplImage* im55= ll.cropFace(im, le, re, offset_pct, dest_sz);

    mon progrmaaee plante

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    cette exception survient quand tu essayes de diviser un nombre par 0...

    Comme, dans ton code, on repère deux divisions (respectivement en ligne 12 et ligne 19), c'est, très certainement, de ce coté là qu'il faut aller investiguer

    Comme on présume que PI, qui est utilisé comme dénominateur à la ligne 12 est correctement défini (sans doute à 3.141592... ), on peut décemment penser que le problème vient de la ligne 19, à laquelle on lit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double scale = dist/reference;
    Il faut donc aller voir du coté de ce à quoi correspond reference

    Cette variable est définie en ligne 17, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double reference = dest_sz.width - 2.0*offset_h;
    comme offset_h est une variable calculée, intéressons nous aussi à ce à quoi cela correspond
    Elle est définie en ligne 4 sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double offset_h = offset_pct[0]* dest_sz.width;
    Cela nous mène donc à la conclusion qu'il y a, "quelque part dans tes données( dest_sz ou offset_pct[0]) " des données qui font que la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dest_sz.width - (2.0* offset_pct[0]* dest_sz.width)
    donne un résultat égale à ... 0

    Il y a donc deux coupable possibles :

    • soit dest_sz.width vaut 0 (car 0 - (2.0 * XXX * 0) = 0 )
    • soit offset_pct[0] vaut 0.5 (car XX - (2.0 * 0.5 * XX ) = 0 )
    comme il n'y a aucune raison sensée de croire que offset_pct[0] ne puisse pas valoir 0.5, je me tournerais naturellement vers le fait que, à un moment donné, dest_sz.width vaut 0

    Comme tu passes l'argrument dest_sz par valeur, j'entrevois deux possibilités au final :

    1. Soit, tu t'es planté en définissant le constructeur par copie de ta classe CvSize et tu as oublié de définir la valeur correcte du membre width
    2. Soit, tu te plante, dans la fonction appelante, en oubliant de définir une valeur correcte pour cette variable
    Les solutions :

    Commence déjà par vérifier l'existance (ou non) d'un constructeur par copie et d'un opérateur d'affectation dans ta classe CvSize (ce sont, respectivement, les fonctions membre CvSize (CvSize const &) et CvSize & operator = (CvSize const &).

    Je te conseillerais donc, pour travailler dans un ordre logique:
    1. Si ta classe CvSize ne manipule pas de pointeurs, supprimes, purement et simplement, la déclaration et la définition de ces deux fonctions pour laisser le compilateur fournir une implémentation qui te conviendra parfaitement (qui se contente de copier l'objet membre à membre )
    2. Si ta classe manipule des pointeurs, veille à ce que la copie se fasse correctement
    3. Une fois que tu es sur que le constructeur par copie et que l'opérateur d'affectation sont bon, vérifie, dans la pile d'appels, que le membre width de la variable qui est utilisée comme argument est correctement défini à une valeur non nulle (et sans doute positive ...
    4. Remonte éventuellement dans ta pile d'appel jusqu'à trouver l'endroit où la valeur correspondante est définie pour déterminer pourquoi elle vaut 0, et, si c'est le cas, s'il est cohérent d'appeler ta fonction
    5. S'il n'y a pas de raison à ce que la valeur correspondante soit définie à 0, places un test qui évitera, justement, l'appel de la fonction (ou des fonctions appelantes) ne soit appelée
    6. S'il est cohérent d'avoir un hauteur potentiellement nulle pour ce que tu veux faire, rajoutes, dans ta fonction, un test qui prend le cas particulier d'une hauteur nulle (par exemple en décrétant "unilatéralement" que, si la hauteur de destination est nulle, la largeur de destination l'est également, et qu'il n'y a rien d'autre à faire pour remplir ton image )
    Ceci dit, une partie de ton problème vient potentiellement du fait que tu passes une structure sous la forme de copie.

    C'est potentiellement un problème dans le sens où:
    • Dans le cas de classes complexe, la copie peut etre extrèmement couteuse, en terme de temps et en terme d'utilisation de la mémoire
    • Dans certains cas, certaines structures sont prévues pour ne pas être copiées
    • Si tu te plantes dans la définition du constructeur par copie (si tu l'implémentes par toi meme ), l'objet utilisé dans la fonction ne correspond pas à l'objet passé en paramètre
    Prends donc l'habitude de passer tes structures par références plutôt que par valeur, et de les déclarer constantes si la fonction appelée ne doit pas les modifier.

    Cela t'évitera bien des problèmes, tant en terme de performances (en évitant les copies qui prennent du temps) qu'en terme de fonctionnalité (en évitant d'essayer de copier des objets non copiables et en évitant les risques liés à des copies foireuses )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    @koala01
    Merci beaucoup pour z votre réponse assez détaillée.
    San appeler cropface tout va bien mais juste lorsque je vais appeler cette fonction avec les les données suivantes au niveau de mail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double offset_pct[2];
    offset_pct[0]=0.2;
    offset_pct[1]=0.2;
    CvSize dest_sz;
    dest_sz.width=80;
    dest_sz.height=64;
     
    IplImage* im55= ll.cropFace(im, le, re, offset_pct,  dest_sz);
    cvShowImage("result4",im55);
      cvWaitKey();
     
    //cvDestroyWindow("result4");
    ToUt se plante même que fonctions qui ont marché précédemment,elles sont plantées.En affichant la mauvaise fenêtre d'alerte.

  6. #6
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Il y a donc probablement une division par zéro dans cropFace.
    Peut-être lui fournis-tu les mauvais paramètres ?

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Pour simplifier
    J'ai intégré ma fonction dans un main d'un autre projet et j'ai fait un debug step by step .donc cette exception s'est lévée au niveau de
    cv::warpAffine(mtx, mtx2, affine_matrix,mtx.size(),cv::INTER_LINEAR, cv::BORDER_CONSTANT,cv::Scalar::all(255));
    donc j'ai vu les valeurs de mtw et mtx2
    //mtx est la conversion de image IplImage* en matrice mtx
    cv::Mat mtx=cv::Mat(im,true);
    cv::Mat mtx2;
    mtx2 est la matrice destination résultante de cette fonction appelée prédifinie.(opencv2.1)
    donc j'ai détecté mon problème:il réside dans la conversion des IplImage* en cv::Mat et vice versa.
    est ce que vous pouvez m'aider.
    Merci

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    cette exception survient quand tu essayes de diviser un nombre par 0...
    Précision : L'erreur arrive quand on essaye de faire une division entière d'un nombre pas 0. Le code montré ne contient que des divisions à virgule flottante, donc l'erreur est ailleurs.

    Par contre, je ne sais pas forcément où. Quand tu débogues, n'as tu pas plus de détails sur quel paramètre pose problème ? Que vaut mtx.size() ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/05/2013, 11h46
  2. Réponses: 1
    Dernier message: 02/05/2013, 09h37
  3. Exception de première chance
    Par MohEllayali dans le forum C++
    Réponses: 2
    Dernier message: 04/03/2009, 11h29
  4. Exception de première chance
    Par Oh-Dae-Su dans le forum C++
    Réponses: 6
    Dernier message: 15/05/2008, 14h17
  5. Exception de première chance
    Par oodini dans le forum C++
    Réponses: 10
    Dernier message: 25/09/2007, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo