Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Error exception non gérée  (Lu 2325 fois)

0 Membres et 1 Invité sur ce sujet

Svetozar

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Error exception non gérée
« le: Octobre 29, 2016, 01:15:02 pm »
Bonjour à tous,

Je suis actuellement en seconde année de BTS Systèmes Numériques option Informatique et Réseaux et notre professeur nous a proposé de travailler avec SFML pendant les vacances scolaires. Nous sommes libres dans le choix de ce que nous voulons faire à condition d'utiliser un peu tous les points de cours que l'on a aborder.

J'ai donc décidé de partir dans un premier temps sur une création dynamique de différentes formes (des boules et des rectangles) sans textures particulières. La création et l'initialisation de mes vecteurs de boules et de rectangles se passent très bien, le problème c'est lorsque je les positionne. J'ai une erreur de ce type :

Lorsque j'effectue un débogage pas-à-pas, je me rends compte que l'erreur apparaît dans mon main() dans la fonction Initialisation_Objets() lorsque j'éxécute Les_Formes.Positionne_Boules();

Je travaille sur Visual Studio en C++.

Voici mon code entier :

C_FORME.h
#include <SFML\Graphics.hpp>
#include <iostream>
#include <vector>
#include "C_BOULE.h"
#include "C_RECTANGLE.h"
#include "T_XY.h"

using namespace std;
using namespace sf;

class C_FORME
{
public:
        C_FORME();
        ~C_FORME();

        void Ajoute_Boule(C_BOULE*);
        void Ajoute_Rectangle(C_RECTANGLE*);
        inline void Positionne_Boules();
        inline void Positionne_Rectangles();
protected :
        vector<C_BOULE*> Les_Boules;
        vector<C_RECTANGLE*> Les_Rectangles;
};

void C_FORME::Positionne_Boules()
{
        /*vector<C_BOULE*>::iterator L_Index;
        for (L_Index = Les_Boules.begin(); L_Index != Les_Boules.end(); L_Index++) {
                (*L_Index)->Positionne_Toi();
        }*/

        try {
                for (auto L_Boule : Les_Boules) {
                        if (L_Boule) L_Boule->Positionne_Toi();
                }
        }
        catch (C_BOULE* P_Boule) {
                cout << "ERREUR" << P_Boule << endl;
        }
}

void C_FORME::Positionne_Rectangles()
{
        /*vector<C_RECTANGLE*>::iterator L_Index;
        for (L_Index = Les_Rectangles.begin(); L_Index != Les_Rectangles.end(); L_Index++) {
                (*L_Index)->Positionne_Toi();
        }*/

        try {
                for (auto L_Rectangle : Les_Rectangles) {
                        if (L_Rectangle) L_Rectangle->Positionne_Toi();
                }
        }
        catch (C_RECTANGLE* P_Rectangle) {
                cout << "ERREUR" << P_Rectangle << endl;
        }
}

C_FORME.cpp
#include "C_FORME.h"
#include <SFML\Graphics.hpp>



C_FORME::C_FORME()
{
        Les_Boules.reserve(10);
        Les_Rectangles.reserve(10);
}


C_FORME::~C_FORME()
{
}

void C_FORME::Ajoute_Boule(C_BOULE* P_Boule)
{
        Les_Boules.push_back(P_Boule);
}

void C_FORME::Ajoute_Rectangle(C_RECTANGLE* P_Rectangle)
{
        Les_Rectangles.push_back(P_Rectangle);
}

C_BOULE.h
#include <SFML\Graphics.hpp>
#include "T_XY.h"

using namespace sf;

class C_BOULE
{
public:
        C_BOULE();
        C_BOULE(float, const T_XY&);
        ~C_BOULE();
        inline void Positionne_Toi();
        inline void Dessine_Toi(RenderWindow*);
protected :
        T_XY Position;
        float Rayon;
        CircleShape* La_Boule;
};

void C_BOULE::Positionne_Toi()
{
        La_Boule->setPosition(Position.X, Position.Y);
}

void C_BOULE::Dessine_Toi(RenderWindow* P_Fenetre)
{
        P_Fenetre->draw(*La_Boule);
}

C_BOULE.cpp
#include "C_BOULE.h"



C_BOULE::C_BOULE()
        :Position{ 0, 0 }, Rayon(10)
{
}

C_BOULE::C_BOULE(float P_Rayon, const T_XY& P_Position)
        :Rayon(P_Rayon), Position(P_Position), La_Boule(nullptr)
{
}

C_BOULE::~C_BOULE()
{
}

C_RECTANGLE.h
#include <SFML\Graphics.hpp>
#include "T_XY.h"

using namespace sf;

class C_RECTANGLE
{
public:
        C_RECTANGLE();
        C_RECTANGLE(float, float, const T_XY&);
        ~C_RECTANGLE();
        inline void Positionne_Toi();
        inline void Dessine_Toi(RenderWindow*);
protected :
        T_XY Position;
        float Longueur;
        float Largeur;
        RectangleShape* Le_Rectangle;
};

void C_RECTANGLE::Positionne_Toi()
{
        Le_Rectangle->setPosition(Position.X, Position.Y);
}

void C_RECTANGLE::Dessine_Toi(RenderWindow* P_Fenetre)
{
        P_Fenetre->draw(*Le_Rectangle);
}

C_RECTANGLE.cpp
#include "C_RECTANGLE.h"



C_RECTANGLE::C_RECTANGLE()
        :Position{ 0, 0 }, Longueur(120), Largeur (50)
{
}

C_RECTANGLE::C_RECTANGLE(float P_Longueur, float P_Largeur, const T_XY& P_Position)
        :Longueur(P_Longueur), Largeur(P_Largeur), Position(P_Position), Le_Rectangle(nullptr)
{

}


C_RECTANGLE::~C_RECTANGLE()
{
}

T_XY.h
struct T_XY
{
        float X;
        float Y;

        inline void operator++(int);
        inline void operator--(int);
        inline void operator+=(const T_XY&);
        inline void operator-=(const T_XY&);
};

void T_XY::operator++(int)
{
        X++;
        Y++;
}

void T_XY::operator--(int)
{
        X--;
        Y--;
}

void T_XY::operator+=(const T_XY& P_Avec)
{
        X += P_Avec.X;
        Y += P_Avec.Y;
}

void T_XY::operator-=(const T_XY& P_Avec)
{
        X -= P_Avec.X;
        Y -= P_Avec.Y;
}

C_ENVIRONNEMENT.h
class C_ENVIRONNEMENT
{
public :
        static C_ENVIRONNEMENT* Get_Environnement();
        float Get_X_MIN() { return X_MIN; }
        float Get_X_MAX() { return X_MAX; }
        float Get_Y_MIN() { return Y_MIN; }
        float Get_Y_MAX() { return Y_MAX; }
protected :
        C_ENVIRONNEMENT();
        static C_ENVIRONNEMENT* Environnement;
        float X_MIN;
        float X_MAX;
        float Y_MIN;
        float Y_MAX;
};

C_ENVIRONNEMENT.cpp
#include "C_ENVIRONNEMENT.h"

C_ENVIRONNEMENT* C_ENVIRONNEMENT::Environnement = nullptr;

C_ENVIRONNEMENT::C_ENVIRONNEMENT()
        :X_MIN(0.0f), X_MAX(640.0f), Y_MIN(0.0f), Y_MAX(400.0f)
{

}

C_ENVIRONNEMENT* C_ENVIRONNEMENT::Get_Environnement()
{
        if (Environnement == nullptr) Environnement = new C_ENVIRONNEMENT;
        return Environnement;
}

Main.cpp
#include <SFML\Graphics.hpp>
#include <iostream>
#include <vector>
#include "C_ENVIRONNEMENT.h"
#include "T_XY.h"
#include "C_FORME.h"
#include "C_BOULE.h"
#include "C_RECTANGLE.h"
using namespace std;
using namespace sf;

RenderWindow* Fenetre_Principale;
C_FORME Les_Formes;
C_ENVIRONNEMENT* Mon_Environnement = C_ENVIRONNEMENT::Get_Environnement();

//========================================
void Initialisation_Objets()
{
        Les_Formes.Ajoute_Boule(new C_BOULE(10, T_XY{ 10, 10 }));
        Les_Formes.Ajoute_Boule(new C_BOULE(20, T_XY{ 30, 30 }));
        Les_Formes.Ajoute_Rectangle(new C_RECTANGLE(120, 50, T_XY{ 100, 100 }));
        Les_Formes.Ajoute_Rectangle(new C_RECTANGLE(100, 30, T_XY{ 200, 200 }));
        Les_Formes.Positionne_Boules();
        Les_Formes.Positionne_Rectangles();
}
//-----------------------------------
void Gestion_Entrees()
{
static Event L_Evenement;
        while (Fenetre_Principale->pollEvent(L_Evenement)) {
                if (L_Evenement.type == Event::Closed) Fenetre_Principale->close();

        }


}
//-----------------------------------
void Affichage()
{
        Fenetre_Principale->clear();
        //.............
        //.............
        Fenetre_Principale->display();

}
//-----------------------------------
int main()
{

        Fenetre_Principale = new RenderWindow (VideoMode(Mon_Environnement->Get_X_MAX(), Mon_Environnement->Get_Y_MAX()),"Test SFML");

        Initialisation_Objets();

        while (Fenetre_Principale->isOpen()) {
                Gestion_Entrees();
                Affichage();
        }

        return 0;
}

Merci d'avance pour le temps que vous prenez à lire mon message ainsi que pour votre éventuelle aide qui me sera précieuse !

Cordialement,
Milan.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Error exception non gérée
« Réponse #1 le: Octobre 29, 2016, 02:32:25 pm »
Est-ce que tu compiles en mode debug en ayant linké la version release de SFML ?

Si oui, il faut link la version debug (sfml-graphics-d, etc.) quand tu compiles en debug.
« Modifié: Octobre 29, 2016, 02:34:17 pm par G. »

Svetozar

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Error exception non gérée
« Réponse #2 le: Octobre 30, 2016, 10:29:40 am »
Merci pour votre réponse rapide !

Donc tout d'abord, je compile en mode release 64 bits



Lorsque je génére simplement la solution, aucun problème :



Lorsque j'éxécute sans débogage en mode release le programme crash :



Et quand je fais un debogage pas à pas j'ai le message que je vous ai montré dans mon premier message.
Voici les librairies link en mode release :



Les librairies link en mode debug :



Lorsque je passe en mode debug, j'ai des erreurs de ce type :



Et quand je compile :



Du coup il me semble bien que j'ai bien link les bonnes librairies mais toujours le même problème.

Svetozar

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Error exception non gérée
« Réponse #3 le: Octobre 30, 2016, 01:51:42 pm »
Je rajouterai que j'ai également bien inclus le dossier "bin" dans ma variable d'environnement  PATH

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Error exception non gérée
« Réponse #4 le: Octobre 30, 2016, 07:00:24 pm »
En debug, tu dois seulement link les -d. Là d'après ton screenshot du mode debug tu link la version release en plus des -d.
Je pense aussi qu'en debug t'as oublié (ou mal écrit) le chemin vers le dossier include de SFML.

Pour le mode release, ça plante à cause d'erreurs dans ton code.
Si tu veux utiliser des pointeurs sur des objets, il faut que ceux-ci soient initialisés avant de t'en servir.
Par exemple dans Positionne_Toi tu utilises La_Boule, un pointeur sur sf::CircleShape, mais tu crées jamais l'objet. Donc ça plante.

Svetozar

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Error exception non gérée
« Réponse #5 le: Octobre 30, 2016, 08:12:27 pm »
D'accord pour les link des librairies !
Ensuite, en effet j'avais carrément omis de préciser le chemin vers le dossier include de SFML en débug, problème réglé.

Et enfin merci énormément car ce détail m'avait échappé, j'ai initialisé le pointeur dans le constructeur de C_BOULE et mon programme ne crash plus !

Merci encore !