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 :

Erreur au lancement de mon programme, mais non trouvé par le debugger


Sujet :

C++

  1. #1
    Débutant Avatar de jockyboss777
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Points : 68
    Points
    68
    Par défaut Erreur au lancement de mon programme, mais non trouvé par le debugger
    Salut a tous !!

    Je vous demande un peu d'aide sur un problème bizarre .

    Comme dit dans le titre lorsque je compile mon programme puis que je l'exécute j'obtiens une erreur de violation d'accès (soit : -1073741819 [0xC0000005]).
    Je lance alors le débugger savoir s'il peut m'éclairer sur la provenance de ce problème, mais là...surprise ! rien aucune erreur le programme tourne très bien et la figure que je dois importer (j'ai oublié de préciser qu'il s'agit d'un loader *.OBJ/*.MTL).

    J'ai donc essayer de cerner le problème à l'ancienne, c.a.d avec des J'ai donc trouvé que cela tombé sur une allocation...mais il y a encore quelque chose d'étrange, l'allocation précédente marche très bien, et si j'intervertis les deux sa ne marche pas, je m'explique :
    Code c++ : 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
     
    ma_fonction_faisant_une_allocation_1(227); //Ne plante pas
    system("PAUSE");
    ma_fonction_faisant_une_allocation_2(227); //Plante
    system("PAUSE");
    ma_fonction_faisant_une_allocation_3(227); //plante forcement
    system("PAUSE");
     
    /*Meme si je met comme cela*/
     
    ma_fonction_faisant_une_allocation_2(227); //Ne plante pas
    system("PAUSE");
    ma_fonction_faisant_une_allocation_1(227); //Plante
    system("PAUSE");
    ma_fonction_faisant_une_allocation_3(227); //plante forcement
    system("PAUSE");
    J'ai pris 227 au hasard.

    Mais le surnaturel : ne s'arrète pas là (avec accent de Pierre Belmare )...non...c'est que le programme marche très bien avec un seul *.obj...Je veux dire par là que si je change la figure a importer et que compile le programme plante

    Vous en pensait quoi ? je dois faire venir un exorciste ?

    bien que le message soit un peu long je ne sais pas si j'ai été assez clair ?! si vous voulez je peux mettre le code source du loader ou de la fonction qui fait l'allocation ?!
    OpenGL est une librairie graphique 3D très évoluée et totalement portable offrant de nombreuses ressources aux programmeurs cherchant à faire de la synthèse d'images (pour les jeux par exemples).



    Je sais que ce pseudo est prétentieux mais je ne savais quoi mettre d'autre (à part Bill Gates peut-être !? )

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Boe,

    Désolé, mais il est actuellement impossible de te répondre, les boules de cristal étant en grève.

    Plus sérieusement, comment veux-tu qu'on te donne une réponse sans le code incriminé ? (par exemple, que font réellement ma_fonction_faisant_une_allocation_x ?
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    screetch
    Invité(e)
    Par défaut
    sous visual studio ?
    il y a une serie de fonctions qui peuvent t'aider
    compile bien avec le flag _DEBUG activé, puis jette un coup d'oeil sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    tmp |= _CRTDBG_ALLOC_MEM_DF;
    tmp &= ~_CRTDBG_CHECK_ALWAYS_DF;
    _CrtSetDbgFlag(tmp);
    ou bien meme
    http://msdn.microsoft.com/en-us/libr...4b(VS.80).aspx

  4. #4
    Débutant Avatar de jockyboss777
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Points : 68
    Points
    68
    Par défaut
    avant tout merci pour vos réponse, je vous passe le code de la fonction qui fait une allocation :
    Code C++ : 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
     
    Points_obj::Points_obj(int size)
    {
        taille = size;
        primoX = new float[size];
        primoY = new float[size];
        primoZ = new float[size];
        secondoX = new float[size];
        secondoY = new float[size];
        secondoZ = new float[size];
        tersioX = new float[size];
        tersioY = new float[size];
        tersioZ = new float[size];
     
        erase();
    }
    et je détruit tous une fois fini :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Points_obj::~Points_obj()
    {
    	delete[] primoX;
    	delete[] primoY;
    	delete[] primoZ;
    	delete[] secondoX;
    	delete[] secondoY;
    	delete[] secondoZ;
    	delete[] tersioX;
    	delete[] tersioY;
    	delete[] tersioZ;
    }

    sinon il vrai que j'ai oublié de préciser que je suis code block, avec openGL et DevIl.
    Je suis sur que c'est n'est pas un problème de taille trop importante pour le tableau, j'ai essayer avec un model obj qui comporte moins de vertex a importer
    OpenGL est une librairie graphique 3D très évoluée et totalement portable offrant de nombreuses ressources aux programmeurs cherchant à faire de la synthèse d'images (pour les jeux par exemples).



    Je sais que ce pseudo est prétentieux mais je ne savais quoi mettre d'autre (à part Bill Gates peut-être !? )

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    Que fait ta méthode erase() ?

    Sinon, je renifle deux problèmes potentiels:
    - Est-ce que tu as un constructeur Points_obj() sans paramètres qui ne fait rien? Si tu l'appelles, tes tableaux ne sont pas initialisés.
    - Est-ce que tu as un autre endroit que le destructeur où tu désalloues les tableaux?

  6. #6
    screetch
    Invité(e)
    Par défaut
    non moi je dis ca sent le constructeur de copie qui se plante

    regle numéro un :
    si tu as besoin d'un destructeur non trivial OU d'un constructeur de copie non trivial OU d'un operateur d'affectation non trivial, alors tu as surement besoin des 3

    ajoute des constructeurs de copie, et mets les private, tu verras peut etre du code qui essayera de les utiliser

  7. #7
    Débutant Avatar de jockyboss777
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Points : 68
    Points
    68
    Par défaut
    Merci encore pour vos réponses :
    Citation Envoyé par cyberpi
    Que fait ta méthode erase() ?

    Sinon, je renifle deux problèmes potentiels:
    - Est-ce que tu as un constructeur Points_obj() sans paramètres qui ne fait rien? Si tu l'appelles, tes tableaux ne sont pas initialisés.
    - Est-ce que tu as un autre endroit que le destructeur où tu désalloues les tableaux?
    erase() sert a mettre toutes les valeur du tableau a zéro.
    Non je n'ai pas d'autre constructeur, et non je n'ai pas d'autre endroit ou je désallous tous se fait dans le destructeur, pourquoi ? je dois le faire ailleur ?

    Citation Envoyé par screetch
    non moi je dis ca sent le constructeur de copie qui se plante

    regle numéro un :
    si tu as besoin d'un destructeur non trivial OU d'un constructeur de copie non trivial OU d'un operateur d'affectation non trivial, alors tu as surement besoin des 3

    ajoute des constructeurs de copie, et mets les private, tu verras peut etre du code qui essayera de les utiliser
    je n'ai rien compris, c'est quoi un "constructeur de copie" ? non trivial ?
    en 1 message tu ma perdu
    Tu pourrai expliquer a un
    OpenGL est une librairie graphique 3D très évoluée et totalement portable offrant de nombreuses ressources aux programmeurs cherchant à faire de la synthèse d'images (pour les jeux par exemples).



    Je sais que ce pseudo est prétentieux mais je ne savais quoi mettre d'autre (à part Bill Gates peut-être !? )

  8. #8
    Débutant Avatar de jockyboss777
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Points : 68
    Points
    68
    Par défaut
    SSSTTTTOOOOPPPPPP !!!!!!
    arrètez de cherche JOCKY LE BOULET a encore frappé ().
    Mon problème venait de la fonction erase(), je m'explique :
    La fonction est une simple boucle for :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0; i<=taille+1; i++)
    mais je ne sais pour quelle raison je suis aller mettre un +1 ici, enfin bref merci d'avoir essayer mais ma bouletitude (fait d'être boulet ) est insondable

    enfin bref...
    OpenGL est une librairie graphique 3D très évoluée et totalement portable offrant de nombreuses ressources aux programmeurs cherchant à faire de la synthèse d'images (pour les jeux par exemples).



    Je sais que ce pseudo est prétentieux mais je ne savais quoi mettre d'autre (à part Bill Gates peut-être !? )

  9. #9
    screetch
    Invité(e)
    Par défaut
    le constructeur de copie, c'est un constructeur du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse(const MacClasse& original);
    qui est censé initialise un nouvel objet de type MaClasse a partir des valeurs de "original".

    L'operateur d'affectation est l'opérateur = qui permet de copier un objet de type MaClasse dans un autre (ressemble a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse& operator=(const MaClasse& original);
    le destructeur, tu connais

    Le point commun entre ces 3 zoziaux la c'est que le compilateur peut en générer un automatiquement pour toi. Le destructeur, par défaut, appelle les autres destruteurs des membres mais ne fait rien de spécial
    Le constructeur de copie va copier directement la mémoire
    De meme pour l'opérateur =
    (c'est un résumé simplifié)

    la regle d'or, c'est que si on a besoin dd'écrire spécifiquement un de ces 3 la, ca veut dire qu'on a besoin des trois a la fois.
    Dans ton cas, le compilateura a généré la copie et l'opérateur = puisque tu ne les as pas précisé; il a fait ca en copiant la mémoire.
    Mais comme tu as un destructeur qui appelle delete[], cela signifie qu'il te faut les 3.

    A l'heure actuelle, si tu appelles une copie comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Points_obj o; // remplir le o quelque part
    Points_obj o2(o); // crée une copie de o et la stocke dans o2
    alors, o et o2 vont tout les deux pointer vers les memes membres (car la memoire a été copiée, lesp ointeurs ont été copiés mais en revanche, pas les choses sur lesquels ils pointaient)
    lorsque o va etre detruit, il va essayer de liberer les flottants (en appelant le destructeur)
    lorsque o2 va etre detruit, il va les detruire une seconde fois, et *BOOM*

    tu as deux solutions :
    - interdire la copie en declarant la copie et l'affectation privées;
    - autoriser la copie et faire une copie plus correcte que ce que le compilateur génère par défaut

  10. #10
    Débutant Avatar de jockyboss777
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Points : 68
    Points
    68
    Par défaut
    aaaaaaa ok c'est vrai je l'avais déja vu, merci pour le tuyau et encore désolé d'avoir solicité le forum pour quelque choses d'aussi stupide
    OpenGL est une librairie graphique 3D très évoluée et totalement portable offrant de nombreuses ressources aux programmeurs cherchant à faire de la synthèse d'images (pour les jeux par exemples).



    Je sais que ce pseudo est prétentieux mais je ne savais quoi mettre d'autre (à part Bill Gates peut-être !? )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2014, 09h42
  2. Il y a une erreur dans mon programme, mais où ?
    Par BillGates62 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/05/2011, 22h44
  3. message d'erreur au lancement de mon programme
    Par krikri1504 dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2008, 17h38
  4. Lancement de mon programme !
    Par Franck.H dans le forum SDL
    Réponses: 5
    Dernier message: 08/06/2006, 14h09
  5. [TP] Erreur au lancement d'un programme PASCAL
    Par rogerone dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/08/2005, 15h54

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