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 :

plantage sur new


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut plantage sur new
    salut a tous,

    mon programme plante et je ne trouve pas la solution. voici le code de la fonction qui fait planter :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
        //largeur de l'écran
        int resolution_x = GetSystemMetrics(SM_CXSCREEN);
        //hauteur de l'écran
        int resolution_y = GetSystemMetrics(SM_CYSCREEN);
     
        //le HDC de l'ecran
        HDC hdcEcran = GetDC(NULL);
        //le HDC mémoire
        HDC hdcMemoire = CreateCompatibleDC(hdcEcran);
        //le HBITMAP de l'image de l'écran
        HBITMAP hbitmap = CreateCompatibleBitmap(hdcEcran, resolution_x, resolution_y);
        //selection de l'objet
        SelectObject(hdcMemoire, hbitmap);
     
        //copie de la surface
        BitBlt(hdcMemoire, 0, 0, resolution_x, resolution_y, hdcEcran, 0, 0, SRCCOPY);
     
        //ici on a un hbitmap valide
     
        //création des variables pour getdiblits
        BITMAP bitmap;
        BITMAPINFO bitmapinfo;
        BYTE *lpBits = NULL;
     
        //initialisation des variables
        ZeroMemory(&bitmap,sizeof(BITMAP));
        ZeroMemory(&bitmapinfo,sizeof(BITMAPINFO));
     
        //
        GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
     
        //initialisation de bitmapinfoheader
        bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bitmapinfo.bmiHeader.biWidth = bitmap.bmWidth;
        bitmapinfo.bmiHeader.biHeight = bitmap.bmHeight;
        bitmapinfo.bmiHeader.biPlanes = 1;
        bitmapinfo.bmiHeader.biBitCount = 32;
        bitmapinfo.bmiHeader.biCompression = BI_RGB;
        bitmapinfo.bmiHeader.biSizeImage = 0;
        bitmapinfo.bmiHeader.biXPelsPerMeter = 0;
        bitmapinfo.bmiHeader.biYPelsPerMeter = 0;
        bitmapinfo.bmiHeader.biClrUsed = 0;
        bitmapinfo.bmiHeader.biClrImportant = 0;
     
        //allocation
        lpBits = new BYTE[bitmapinfo.bmiHeader.biWidth*bitmapinfo.bmiHeader.biHeight*4];
     
        //position du point de pixel
        bool chercher_encore = false;
     
        //on récupere ls données
        if(GetDIBits(hdcEcran, hbitmap, 0, (UINT)bitmapinfo.bmiHeader.biHeight, lpBits, &bitmapinfo, DIB_RGB_COLORS)){
     
            //si GetDIBits à fonctionné
     
            //on lit chaque coef du RGB
            int r = lpBits[4*((pixel.y*bitmapinfo.bmiHeader.biWidth)+pixel.x)+2];
            int g = lpBits[4*((pixel.y*bitmapinfo.bmiHeader.biWidth)+pixel.x)+1];
            int b = lpBits[4*((pixel.y*bitmapinfo.bmiHeader.biWidth)+pixel.x)];
     
            //si on ne trouve pas de pixel bleu
            if(!verifier_couleur_bleu(r,g,b)){
     
                //il faut continuer
                chercher_encore = true;
     
            }
     
        }
     
        //on libere
        delete(&lpBits);
     
        //on supprime le HBITMAP
        DeleteObject(hbitmap);
        //on libere le HDC mémoire
        DeleteDC(hdcMemoire);
        //on libere le HDC de l'ecran
        ReleaseDC(NULL, hdcEcran);
     
        return chercher_encore;
    ça plante au niveau du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lpBits = new BYTE[bitmapinfo.bmiHeader.biWidth*bitmapinfo.bmiHeader.biHeight*4];
    j'imagine donc que c'est un problème de mémoire. voyez vous une erreur vous?

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    2 idées au hasard:

    - un debuggeur ne peut-il pas t'en dire un peu plus sur les raisons du plantage ?

    - n'y a-t-il pas moyen de faire un try/catch autour du new pour récupérer une quelconque exception générée ?

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Y'aurait plus précis que : "ça plante" ie, ça compile pas? ça plante à l'exécution? si c'est à l'éxécution alors que te dis le message d'erreur, le débogueur. etc..

    Combien font biWidth et biHeight?

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    le plantage s'effectue au moment de l'exécution. cette fonction est appelée des dizaines (voir centaines) de fois avant plantage. je ne pense donc pas que le probleme vienne de biWidth et biHeight (respectivement 800 et 1280)

    le prog est en mode console, et le message "this application has requested the runtime to terminate it in a unusual way" s'affiche au plantage.

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut

    ???

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Merci Goten, c'était ça!

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    T'as bien virer le & (jvois pas ce qu'il faisait là) et remplacer par delete [] ? (j'ai oublié de le préciser )

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    pour le &, c'etait une erreur d'inatention.

    quelle différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    delete lpbits;
    delete(lpbits);
    delete [] lpbits;
    ??

  9. #9
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    new [] => delete [];
    new => delete;

    new [] => delete : comportement indéfinie.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    ok merci

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    En mode Debug, pour que ça plante plus près du bon moment: Régler la CRT pour une vérification systématique avec _crtSetDbgFlag() et le flag _CRTDBG_CHECK_ALWAYS_DF.

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

Discussions similaires

  1. [MFC] Plantage sur LoadFrame
    Par thieum74 dans le forum MFC
    Réponses: 11
    Dernier message: 06/09/2007, 14h15
  2. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 01h29
  3. [firefox] plantage sur une url
    Par ggnore dans le forum Firefox
    Réponses: 2
    Dernier message: 12/05/2005, 23h06
  4. [DB2]Plantage sur COMMIT
    Par Dundee dans le forum DB2
    Réponses: 1
    Dernier message: 24/11/2004, 12h05
  5. [LG]plantage sur une commande basique !
    Par Jeff on the web dans le forum Langage
    Réponses: 5
    Dernier message: 13/01/2004, 20h07

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