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

SDL Discussion :

Erreur 0xC0000005 lorsque j'essaie enregistré une image en .png


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Novembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Novembre 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Erreur 0xC0000005 lorsque j'essaie enregistré une image en .png
    Bonjour, tout le monde!
    Je suis nouveau sur le forum. Alors, veuillez m'excuser pour la mise en page, je dois encore m'habituer à ce forum.
    J'ai installé la SDL2 grâce au template de Alexandre Laurent et voici le lien du téléchargement:http://jeux.developpez.com/telecharg...ur-Code-Blocks

    Ensuite, j'ai installé la bibliothèque SDL_image et jusque là tous va bien mon code fonctionne et les deux bibliothèques sont bien liées.
    Donc je décide d'enregistrer mon image grâce à la fonction IMG_SavePNG. C'est alors que j'ai le code 0xC0000005.
    J'utilise le debuger pour voir si c'est mon code le problème. Non, c'est une autre fonction dans les bibliothèques qui plante...
    J'ai cherché pendant des heures, rien à faire, je suis bloqué.

    Debuguer:
    Nom : Debuguer.PNG
Affichages : 315
Taille : 95,7 Ko

    Voici un petit résumé de ce que fait mon code. Il va chercher 247 images sur mon disque dur. Après, il les replace dans une grande image d'environs 8000px par 8000px selon des coordonnées précises. Ensuite, je veux sauvegarder cette grande image,et c'est là que ça plante . Ensuite, ça affiche l'image dans une fenêtre jusqu'à ce qu'on appuie sur Q,pour que finalement, le programme se ferme.

    Voici mon code:
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    #include <stdio.h>
    #include <string>
    #include <stdint.h>
    #include <iostream>
     
    using namespace std;
     
     
    int main(int argc, char** argv)
    {
        //déclaration des surfaces
        SDL_Rect position;
        position.x=0;
        position.y=0;
        int ligne = 15, colonne = 15;
        SDL_Surface *image_source = NULL, *image_cible = NULL;
        image_cible = SDL_CreateRGBSurface(0, colonne * 512, ligne * 512, 32, 0, 0, 0, 0);//512 est la taille des plus petite image en pixel
     
        char axeX[3]={'0'};//sert à pouvoir convertir des chiffre en charactère pour donner la bonne direction pour aller chercher les photos
        char axeY[3]={'0'};//sert à pouvoir convertir des chiffre en charactère pour donner la bonne direction pour aller chercher les photos
     
        //boucle qui parcours le disque pour assemblé les photos
        for(int i = 0 ; i < ligne ; i++)
        {
     
            for(int j = 0 ; j < colonne ; j++)
            {
     
                sprintf(axeY,"%d",(j-8));//convertion coordonné en char
                sprintf(axeX,"%d",(i-8));//convertion coordonné en char
     
                /*création du path en string*/
                string path="./toute/photo/";
                path.append(axeX);
                path.append(",");
                path.append(axeY);
                path.append(".png");
     
               /*convertion string en const char*/
                char temp[path.length()+1];
                size_t length =path.copy(temp,path.length());
                temp[length]='\0';
                cout<< temp<<endl;
     
                /* vas cherhcer le fichier*/
                SDL_RWops *file = SDL_RWFromFile( temp , "rb");
                image_source=IMG_LoadPNG_RW(file);
     
                /*calcule la position de l'image dans la grosse image*/
                position.x = image_source->w * j;
                position.y = image_source->h * i;
                /*l'insert dans la grande
                SDL_BlitSurface(image_source, NULL, image_cible, &position);
            }
        }
     
        /*sauvegarde + libère l'espace*/
        IMG_SavePNG(image_cible, "map.png");//ligne problématique si je l'enlève j'ai aucun porblème.
        SDL_FreeSurface(image_cible);
     
        if (SDL_Init(SDL_INIT_VIDEO) != 0 )
        {
            fprintf(stdout,"Échec de l'initialisation de la SDL (%s)\n",SDL_GetError());
            return -1;
        }
        {
            /* Création de la fenêtre */
            SDL_Window* pWindow = NULL;
            pWindow = SDL_CreateWindow("Ma première application SDL2",SDL_WINDOWPOS_UNDEFINED,
                                                                      SDL_WINDOWPOS_UNDEFINED,
                                                                      1000,
                                                                      1000,
                                                                      SDL_WINDOW_SHOWN);
            SDL_Renderer *pRenderer = SDL_CreateRenderer(pWindow,-1,SDL_RENDERER_ACCELERATED);
            if ( pRenderer )
            {
                /*prend un image plus petite(j'arrive pas à afficher la grandre au complet)*/
                SDL_RWops *file = SDL_RWFromFile("./toute/photo/0,0.png", "rb");
                image_source=IMG_LoadPNG_RW(file);
                if(image_source)
                {
                    SDL_Texture* pTexture = SDL_CreateTextureFromSurface(pRenderer, image_source);
                    if(pTexture)
                    {
                        SDL_Rect dest = { 640/2 -  image_source->w/2,640/2 -   image_source->h/2,   image_source->w,   image_source->h};
                        SDL_RenderCopy(pRenderer,pTexture,NULL,&dest);
                        SDL_RenderPresent(pRenderer);
                        SDL_Event event; /* La variable contenant l'événement */
                        int continuer = 1; /* Notre booléen pour la boucle */
                        while (continuer) /* TANT QUE la variable ne vaut pas 0 */
                        {
                            SDL_WaitEvent(&event); /* On attend un événement qu'on récupère dans event */
                            switch(event.type) /* On teste le type d'événement */
                            {
                                case SDL_QUIT: /* Si c'est un événement QUITTER */
                                    continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                                    break;
                                case SDL_KEYDOWN: /* Si appui sur une touche */
                                    switch (event.key.keysym.sym)
                                    {
                                        case SDLK_q: /* Appui sur la touche Q, on arrête le programme */
                                            continuer = 0;
                                            break;
                                    }
                                    break;
                            }
                        }
                        SDL_DestroyTexture(pTexture); // Libération de la mémoire associée à la texture
                    }
                    else
                    {
                        fprintf(stdout,"Échec de création de la texture (%s)\n",SDL_GetError());
                    }
                    SDL_FreeSurface( image_source); // Libération de la ressource occupée par l'image
                }
                else
                {
                    fprintf(stdout,"Échec de chargement du sprite (%s)\n",SDL_GetError());
                }
     
                SDL_DestroyRenderer(pRenderer); // Libération de la mémoire du SDL_Renderer
     
            }
            else
            {
                fprintf(stdout,"Échec de création du renderer (%s)\n",SDL_GetError());
            }
     
     
      /*fermeture*/
        if( pWindow )
        {
            SDL_DestroyWindow(pWindow);
        }
        else
        {
            fprintf(stderr,"Erreur de création de la fenêtre: %s\n",SDL_GetError());
        }
    }
     
        SDL_Quit();
     
        return 0;
    }
    Avant d’afficher sur le forum j'ai vérifié s’il n’y avait pas un poste déjà existant . De plus, je sais se que ça signifie: "Program received signal SIGSEGV, Segmentation fault". Cela signifie que je déborde d'un tableau ou d'une variable. Sauf que je ne sais pas où ni comment ça se produit . Je sais aussi que ce n'est pas dû à la taille de l'image parce que si j'essaye d'enregistrer seulement une petite image de 512x512 au lieu de la grande image, j'ai la même erreur . Donc, si quelqu'un pouvait me donner un coup de main ça serait grandement apprécié.

    Merci de prendre le temps de me répondre et de m'aider.
    Cordialement, Crazy Creepy.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Lorsque votre débogueur s'arrête sur un crash, vous pouvez utiliser la liste d'appels (callstack) pour remonter les niveaux afin de revenir à votre code qui a entrainer le crash dans la bibliothèque. Pour plus de renseignement sur le débogage.
    Aussi, il se pourrait qu'il soit impossible de faire une image de 8000x8000, si vous utilisez OpenGL (en tant que rendu), car l'image peut être considérée trop grande par la carte graphique. Une solution serait d'utiliser uniquement les SDL_Surface, sans jamais passer par les SDL_Texture, mais le temps de rendu peut être long, à voir.
    Bref, regardez sur laquelle de vos fonctions à vous, cela crash et dites le nous.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Novembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Novembre 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    J'ai fait comme tu m'as recommander utiliser le callcstack,
    j'ai utilisé les breakpoints avec le Debugger.
    Cela fais juste confirmé ce que je pensais c'est cette fonction (IMG_SavePNG(image_cible, "map.png") que j'appel qui plante.

    Voici le résultat de mon débuguer:

    Nom : DEbuger2.PNG
Affichages : 224
Taille : 73,8 Ko

    Savez-vous ce que signifie "??()" parce que je ne comprends ce que cela veut dire ni les dernières lignes du Debugger, ce qui me déboussole un peu. De plus, je ne peux pas lire des .DLL , j'ai téléchargé les codes sources de la bibliothèque à cette adresse : https://www.libsdl.org/projects/SDL_image/. J'ai donc trouvé la déclaration de la fonction IMG_SavePNG qui appelle IMG_SavePNG_RW.J'ai alors appris que IMG_SavePNG_RW utilisait SDL_SetError("Passed NULL dst"); et que ni IMG_LoadPCX et SDL_memset sont appelé par la fonction.

    J’ai alors 2 questions. En premier, savez-vous comment je peux attraper l'erreur envoyez à SDL_SetError("Passed NULL dst");? Ensuite, comment deux fonctions qui ne sont pas appelées par le programme font planter ce dernier?

    Cordialement Crazy Creepy.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    "??()" signifie que le débogueur n'a pas pu récupérer les informations de débogage pour cette partie du code (notamment car c'est le code des bibliothèques que vous utilisez). En réalité, même si vous y aviez accès, cela ne vous servirai que très peu.

    J’ai alors 2 questions. En premier, savez-vous comment je peux attraper l'erreur envoyez à SDL_SetError("Passed NULL dst");? Ensuite, comment deux fonctions qui ne sont pas appelées par le programme font planter ce dernier?
    Si le SDL_SetError() avait été réalisé, le programme serait sorti de la fonction IMG_SavePNG() et vous auriez pu voir que la valeur de retour indique une erreur. De là, vous auriez pu appeler SDL_GetError() pour obtenir le message "Passed NULL dst".

    Les fonctions sont appelées, ou elles ne font pas planter le programme .
    Note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image_cible = SDL_CreateRGBSurface(0, colonne * 512, ligne * 512, 32, 0, 0, 0, 0);
    Vous devriez absolument vérifier les valeurs de retour des fonctions. Si la ligne ci-dessus retourne NULL, alors votre programme va crasher. Donc le détecter au plus tôt, permet de mieux s'en protéger.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. ENREGISTRER UNE IMAGE OU UN FICHIER .DOC
    Par manudja dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2005, 13h32
  2. enregistrer une image
    Par meli0207 dans le forum MFC
    Réponses: 35
    Dernier message: 12/07/2005, 09h00
  3. [GLScene] Comment enregistrer une image au format TGA
    Par Invité dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 27/05/2005, 15h12
  4. Enregistrer une image
    Par N@sH dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/05/2005, 10h07
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2004, 17h18

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