Code bon mais programme qui ne démare pas !!

Fermé
freakhopes Messages postés 38 Date d'inscription vendredi 30 janvier 2009 Statut Membre Dernière intervention 5 septembre 2009 - 3 août 2009 à 17:54
 Freak - Hopes - 4 août 2009 à 20:00
Bonjour,
je viens de finir un petit programme : Un jeu de Sokoban (certaines personne reconnaîtrons le TP du site du zéro), seulement le programme ne démarre pas je m'explique :

1) La fenêtre s'ouvre on a plusieur choix : 1 - jouer
2 - éditeur de niveau
Cliquer - voir les options

Seulement si je veut jouer ou éditer un niveau le programme se ferme complétement en remontant le code j'ai deux hypothèse : soit le fichier ou j'ai enregistrer les données pour la carte ne passe pas (pourtant il passe avec la correction) soit c'est ma fonction charger_niveau qui n'est pas bonne, voici donc le code de cette fonction :

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>

#include "constantes.h"
#include "fichier.h"

int charger_niveau(int niveau[][NB_BLOCS_HAUTEUR]);
int sauvegarder_niveau(int niveau[][NB_BLOCS_HAUTEUR]);


int charger_niveau(int niveau[][NB_BLOCS_HAUTEUR])
{
    FILE* fichier = NULL;
    char ligne_fichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
    int i = 0, j = 0;

    fichier = fopen("niveaux.lvl", "r");
    if(fichier == NULL)
        return 0;

    fgets(ligne_fichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);

    for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    {
        for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
        {
            switch (ligne_fichier[(i * NB_BLOCS_LARGEUR) + j])
            {
                case '0':
                    niveau[j][i] = 0;
                    break;

                case '1':
                    niveau[j][i] = 1;
                    break;

                case '2':
                    niveau[j][i] = 2;
                    break;

                case '3':
                    niveau[j][i] = 3;
                    break;

                case '4':
                    niveau[j][i] = 4;
                    break;
            }
        }
    }

    fclose(fichier);
    return 1;
}


Merci pour votre aide, cordialement Baptiste.

3 réponses

Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 329
4 août 2009 à 08:25
Salut.
là je ne vois rien de mauvais.
Je te conseil dans ces cas là, soit d'utiliser le debugueur si tu as une erreur de segmentation soit de faire des impressions un peu partout dans ton code afin de savoir où il se termine. Une fois que tu aura localiser l'endroit de l'erreur, elle sera plus facile à corriger.
Il est difficile de donner un avis juste sur une fonction qui n'a aucune raison de fermer le programme sauf erreur de segmentation.
0
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 329
4 août 2009 à 08:31
Après réflexion...
es tu sur de ton switch :
ligne_fichier[(i * NB_BLOCS_LARGEUR) + j]
lorsque i vaut NB_BLOCS_LARGEUR-1 et j vaut NB_BLOC_HAUTEUR-1, tu as :
ligne_fichier[(NB_BLOCS_LARGEUR-1)*NB_BLOCS_LARGEUR+NB_BLOC_HAUTEUR-1]
ce qui fait :
ligne_fichier[NB_BLOCS_LARGEUR^2-NB_BLOCS_LARGEUR+NB_BLOC_HAUTEUR-1]
Alors que tu devrais tendre vers NB_BLOCS_LARGEUR*NB_BLOC_HAUTEUR
non ?
0
Freak - Hopes
4 août 2009 à 20:00
Hum... Hum.... bien vu ^^' je vais y réfléchir voir =) merci en tout cas de ta réponse rapide :D
0