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 :

Le debugger m'empêche de deboguer !


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Le debugger m'empêche de deboguer !
    Salut j'ai un gros problème; j'ai une fonction qui bug et je ne peux pas savoir quel est le problème car lorsque je lance le programme en mode debug ça marche sans problème, ça m'est déjà arrivé il y un bout de temps et je voudrais savoir pourquoi ça se passe comme ça, comment y remédier et j'aimerais bien aussi qu'on m'aide avec cette fonction

    La fonction génère une variable contenant les données d'une map (constituée de plusieurs plans).

    Voici la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct TMAP
    {
        int w, h,//Largeur et hauteur de la map (en nombre de tiles)
        tw, th,//Largeur et hauteur de chaque tile
        plannb;//Nombre de plans
        **tilesinfos,//Informations sur chaque tile (tangible ou pas, etc ...)
        ***map,//Matrice de tiles(map[plan numéro i][xème tile en partant de lagauche][yème plan partant du haut]
        loadinfo;//Information sur le chargement (si le pointeur sur fichier ou surface égal NULL)
        SDL_Surface **tileset;//Les tilesets (tileset[plan numéro i])
    }TMAP;
    Les données sont contenues dans des fichiers :
    Un fichier "datas" qui contient la largeur et la hauteur en nombre de tiles de la map, la largeur et la hauteur des tiles ainsi que le nombre de plans de la map
    Un fichier _%dxd (%d est le numéro du plan) qui contient le nombre de tiles différents constituant le plan, leurs données (qui ne sont qu'un nombre 8 bits) et la couleur transparente
    Un fichier _%dxt (%d est le numéro du plan) qui n'est rien d'autre que le tileset du plan


    Et voici la fonction qui la charge :

    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
    TMAP loadtiledmap (const char *mapname)
    {
        TMAP map;
        char adress [200];
        int tilenb = 0, i, j, plani;
        Uint32 alpha;
        FILE *file=NULL;
     
        map.loadinfo = 0;
     
    //--------------------Fichier primaire("data")
        sprintf (adress, "maps/%s/datas", mapname);
        file = fopen (adress, "r");
        if (!file)
        {
            map.loadinfo = -1;//Code d'échec de chargement de fichier primaire
            return map;
        };
     
        fscanf (file, "%dx%dx%dx%dx%d\n", &map.w, &map.h,
                &map.tw, &map.th, &map.plannb);/*Données primaires : largeur et hauteur de la map en nombre de tiles, largeur et hauteur des tiles et nombre de plans*/
     
        map.map = (char***)malloc (map.plannb*sizeof (char**))/*Allocation d'autant de matrices de tiles que de plans*/
        map.tileset = (SDL_Surface**)malloc (map.plannb*sizeof (SDL_Surface*));/*Allocation d'autant de tilesets que de plans*/
        map.tilesinfos = (char**)malloc (map.plannb*sizeof (char*));/*Allocation d'autant de tableaux d'informations sur les tiles que de plans*/
     
        fclose (file);
    //---------------------Fichier de plans
     
        for (plani = 0; plani < map.plannb; plani++)//Boucle for pour charger les données de chaque plan
        {
            sprintf (adress, "maps/%s/_%dxd", mapname, plani);//Adresse du plan
            file=fopen (adress, "r");//Ouverture du fihier de plan i
            if (!file)
            {
                map.loadinfo = -2;//Code d'échec de chargement de fichier de plan
                return map;
            };
            fscanf (file, "+%d+%d\n", &tilenb, &alpha);//Nombre de tiles + canal alpha du plan
            map.tilesinfos [plani] = (char*)malloc (tilenb);//Allocation des infos des tiles
            for (i=0;i<tilenb;i++)fscanf (file,"%d,", (int*)&map.tilesinfos[plani][i]);/*Chargement des infos de tiles*/
            fscanf (file, "\n");//Retour à la ligne
     
            map.map [plani] = (char**)malloc (map.w*sizeof (char*));//Allocation du nombre tiles en largeur
            for (i=0;i<map.w;i++)map.map[plani][i]=(char*)malloc (map.h);//Allocation du nombre tiles en hauteur
            for (j=0; j<map.h;j++)
            {
                for (i=0;i<map.w;i++)
                {
                    fscanf (file, "%d.", (int*)&map.map [plani][i][j]);//Lecture du tile de coordonnée {i;j}
                };
                fscanf (file, "\n");//retour à la ligne après la ligne de tiles
            };
            fclose (file);
     
    56     sprintf (adress, "maps/%s/_%dxt", mapname, plani);//Adresse du tileset
    57
    58     map.tileset [plani] = SDL_LoadBMP (adress);//Chargement du tileset
    59     if (!map.tileset [plani])
    60     {
    61         map.loadinfo = -3;//Code d'echec du chargement du tileset
    62         return map;
    63     };
    64     SDL_SetColorKey (map.tileset [plani], SDL_SRCCOLORKEY, alpha);//Application de la transparence
        };
        return map;
    };
    (Ca bloque autour des lignes 56~64)

    Et enfin les fichiers à charger :

    Fichier datas
    30x30x32x32x1
    Fichier _0xd
    +3+0
    0,0,0,
    0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.
    1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.
    0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.
    1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.
    0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.
    1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0
    0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.
    1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.
    0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.
    1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.1.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
    Les fichiers n'ont pas de problème.
    Le bug de chargement survient à partir de 30 tiles de hauteur et/ou de largeur.

    Merci !

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    salut !
    ligne 40
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    map.tilesinfos [plani] = (char*)malloc (tilenb);
    for (i=0;i<tilenb;i++)fscanf (file,"%d,", (int*)&map.tilesinfos[plani][i]);
    3 char
    3 int

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Il faut que je remplace le orange du code par le orange que tu m'as donné et le bleu du code par le bleu que tu m'as donné ? C'est ce que j'ai fait mais ça n'as pas marché

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Enuxa Voir le message
    je ne peux pas savoir quel est le problème car lorsque je lance le programme en mode debug ça marche sans problème
    Bon à savoir : ceci est - toujours - dû à un écrasement de la mémoire quelque part.

    Un debugger "tracke" et "flushe" la mémoire au fur et à mesure. Un programme non (les "free" ne libèrent pas vraiment, sauf cas exceptionnels)


    Tu auras le même comportement si tu rajoutes des printf et que tu flushes.

    Dans certains cas ça passe alors que ça passait pas, ou l'inverse...

    Il y a donc quelque part un écrasement. Et ce qu'a pointé anarchasis en est un. Il y en a peut-être d'autres..

    Dans ce qu'il a pointé, tu alloues un tableau de char, et dans chacun tu stockes un pointeur sur un entier. D'où gros problème

    Sans vouloir rentrer dans des détails, en gros tu alloues 1 byte pour stocker un pointeur, qui est normalement au minimum un entier, donc 4 bytes sur un 32 bits.. Et donc quand tu lis jusqu'a nombre, tu va écraser ce qu'il y a après le tableau... (donc soit les prochaines strucures, soit autre chose)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par Enuxa Voir le message
    Voici la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct TMAP
    {
        int w, h,        //Largeur et hauteur de la map (en nombre de tiles)
        tw, th,          //Largeur et hauteur de chaque tile
        plannb ;         //Nombre de plans
        **tilesinfos,    //Informations sur chaque tile (tangible ou pas, etc ...)
        ***map,          //Matrice de tiles(map[plan numéro i][xème tile en partant de lagauche][yème plan partant du haut]
        loadinfo;         //Information sur le chargement (si le pointeur sur fichier ou surface égal NULL)
        SDL_Surface **tileset;   //Les tilesets (tileset[plan numéro i])
    }TMAP;
    Question bete : tes champs tilesinfo, map en loadinfo, tu t'attends a ce qu'ils soient de quel type avec ce que tu as ecrit ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @gangsoleil
    Question bete : tes champs tilesinfo, map en loadinfo, tu t'attends a ce qu'ils soient de quel type avec ce que tu as ecrit ?
    j'ai fait confiance ... tu as bien lu !

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    @souviron34 : Aah j'avais déjà remarqué que printf avait cet effet là, merci beaucoup de m'avoir expliqué !

    @gangsoleil : le champ tilesinfo contiendra 8 informations, qui seront des propriétés vraies ou fausses. Je compte utiliser un bit pour chaque info (comme avec les flags)

  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    On m'a donné une solution à mon problème sur le site du zér0 : stocker les valeurs tilesinfos et celles de la map dans un int temporaire et ça marche.

    Merci de m'avoir aidé

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par Enuxa Voir le message
    @gangsoleil : le champ tilesinfo contiendra 8 informations, qui seront des propriétés vraies ou fausses. Je compte utiliser un bit pour chaque info (comme avec les flags)
    Relis la structure telle que je l'ai affichee (c'est la meme que toi, mais une mise en page differente), et regarde notamment ou se situent les ';'.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Tu as mis un espace entre "plannb" et le point virgule et tu as espacé les commentaires?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Relis un peu attentivement....

    C'est plus évident sur la présentation de gangsoleil.

    D'où l'intérêt de bien présenter, indenter, et formatter son code source..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Aah oui désolé, quand j'ai posté le message sur le forum j'ai oublié de mettre "char" pour les matrices

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

Discussions similaires

  1. [TP]debugger
    Par mmm dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 07/12/2003, 22h07
  2. [BPW]Exécution du debugger Windows sur un OS 32 bits
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 28/11/2003, 22h55
  3. [VB6] Comment Debugger une activeX ??
    Par Berns dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/05/2003, 17h34
  4. Debugger sous Linux
    Par Shadow Blade dans le forum Choisir un environnement de développement
    Réponses: 6
    Dernier message: 29/11/2002, 18h54
  5. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34

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