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 :

Ce programme "a cessé de fonctionner" + status 255


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Par défaut Ce programme "a cessé de fonctionner" + status 255
    Amis internautes, bonjour !

    J'ai voulu coder une fonction qui ouvre un fichier en mode texte, et qui charge son contenu dans une structure. Voilà le 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
    int LoadMap(const char lNumber, LevelData* ldat) {
     
        char lvl[4];
        int buf;
        sprintf(lvl, "lvl%c", lNumber);
     
        FILE *lvlFile = NULL;
        if ((lvlFile = fopen(lvl,"r")) == NULL) {
            fprintf(stderr, "Can't open %s", lvl);
            exit(EXIT_FAILURE);
        }
     
        int i, j;
        ldat->lW = GETN; // GETN défini pour fgetc(lvlFile) - '0'
        buf = GETN; // Jumping \n character
     
        ldat->lH = GETN;
     
        ldat->map = malloc(ldat->lW * sizeof(int*));
        for (i = 0; i < ldat->lH; i++)
            ldat->map[i] = malloc(ldat->lH * sizeof(int));
        if (ldat->map == NULL)   {
            fprintf(stderr, "Can't allocate");
            exit(EXIT_FAILURE);
        }
     
        for (i = 0; i < ldat->lH; i++)    {
            buf = GETN;
            for (j = 0; j < ldat->lW; j++)    {
                ldat->map[i][j] = GETN;
                if (ldat->map[i][j] == 2)   {
                    ldat->pPosInTabX = j;
                    ldat->pPosInTabY = i;
                }
                fprintf(stdout, "%d", ldat->map[i][j]);
            }
            fprintf(stdout, "\n");
        }
        fprintf(stdout, "Player Position: %d;%d\n", ldat->pPosInTabX, ldat->pPosInTabY);
        fclose(lvlFile);
        return 0;
    }
    .
    La structure LevelData est définie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct  {
        int **map;                  // Quite self explanatory
        int lW, lH;                 // Level Width and Heigh in tiles
        SDL_Rect xyTile;            // Tile size (square)
        SDL_Rect xyPlayer;          // Player size (square)
        SDL_Rect xyOrigin;          // Place on the screen where the mapping will begin
        int pPosInTabX, pPosInTabY; // Player position in map tab
        int beautySpace;            // Space between two tiles
    } LevelData;
    et est déclarée dans le main comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LevelData *ldat = NULL;
        if ((ldat = malloc(sizeof(ldat))) == NULL)
            fprintf(stderr, "Can't allocate LevelData Structure");
    Toujours dans le main, j'appelle la fonction "LoadMap('1', ldat);".

    Sauf que... Le compilo (codeblocks + mingw) m'envoie soit Process terminated with status 255 soit Process terminated with status XXXXXXXXXX.
    Et windows s'affole et m'affiche prog.exe a cessé de fonctionner.
    (En fait ce problème apparait à la fin du programme, mais c'est après la création de cette fonction que ça a commencé à planter, donc je vais vous épargner le reste du code).

    Tandis que le compilo m'envoie pas d'erreurs, mais un warning, pour la fonction LoadMap : variable 'buf' set but not used. Etrange, non ?

    Et encore plus étrange, le debugger intégré à codeblocks n'arrive pas à me trouver l'erreur: le programme se déroule du début jusqu'à la fin, puis quand ça plante il m'affiche sur le stack des entrées vides et des fonctions système (la liste :
    Code none : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #0 00000004     ?? () (??:??)
    #1 74D73EB1     UxTheme!GetThemeFilename() (C:\Windows\SysWOW64\uxtheme.dll:??)
    #2 74D73E27     UxTheme!GetThemeFilename() (C:\Windows\SysWOW64\uxtheme.dll:??)
    #3 77DE481E     ?? () (??:??)
    #4 77DE486B     ?? () (??:??)
    #5 77DF0A38     ?? () (??:??)
    #6 77DF091D     ?? () (??:??)
    #7 76C239BE     KERNEL32!GetCurrentApplicationUserModelId() (C:\Windows\SysWOW64\kernel32.dll:??)
    #8 ??   ?? () (??:??)
    ).

    Et quand je passe le programme au désassembleur (ollydbg), ce dernier m'envoie un truc du genre impossible de lire à l'adresse 0x00000002 (permission refusée), et ça à chaque fois.

    Depuis 8 heures ce matin je n'arrive pas à trouver la couille, par pitié aidez moi .

    Merci d'avance pour vos réponses !

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Par défaut
    Incompréhensible, je télécharge un template de LittleWhite pour la SDL2, j'inclus tous mes fichiers dans le projet, et là ça marche...

    En revanche j'ai toujours le warning "variable 'buf' set but not used [-Wunused-but-set-variable]", qui n'a pas lieu d'être...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour ton premier problème, je te conseille d'utiliser un outil comme Valgrind.

    Pour ta variable buf, c'est juste que tu lui donnes une valeur, mais ne l'utilises jamais.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Par défaut
    Valgrind spa possible ça je suis sous windows, pour l'instant j'utilise le debugger intégré à mon ide, et ollydbg si je suis vraiment bloqué.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Dr Memory dans ce cas alors.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Première chose : je rajouterai une assertion pour protéger le pointeur passer en paramètre contre la valeur NULL : http://alexandre-laurent.developpez....ications/#L3-A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ldat->map = malloc(ldat->lW * sizeof(int*));
        for (i = 0; i < ldat->lH; i++)
    Pour un tableau non carré, ça va planté. En effet, vous faites une allocation de lW éléments et vous parcourez lH éléments par la suite ... ça va pas marcher

    Il en est de même pour le remplissage du tableau, je ne suis pas certains que i correspondre à la hauteur (y) et j à la largeur (x). Vérifiez bien votre code.
    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.

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

Discussions similaires

  1. débogage d'un programme qui a cessé de fonctionner
    Par NGeVtC87 dans le forum Programmation système
    Réponses: 0
    Dernier message: 09/04/2013, 08h21
  2. Programme.exe a cessé de fonctionner avec GTK+
    Par Mctry dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 31/01/2013, 10h39
  3. Programme.exe a cessé de fonctionner
    Par mayyyyya dans le forum C
    Réponses: 1
    Dernier message: 04/06/2009, 12h51
  4. Pb deploiement : "Le programme a cessé de fonctionner"
    Par vikz dans le forum Général Dotnet
    Réponses: 13
    Dernier message: 12/03/2008, 15h39
  5. Fonction Quoted printable qui ne fonctionne pas.
    Par leCcsympas dans le forum C
    Réponses: 3
    Dernier message: 13/01/2007, 18h54

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