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 :

erreur : segmentation fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut erreur : segmentation fault
    Bonjour,
    voila je suis entrain de coder ça

    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
    fichiers.c
    ----------
     
    Par Rémi
    Rôle : fonctions de lecture / écriture de fichiers de niveau.
    */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "constantes.h"
    #include "fichiers.h"
    int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE *fichier = NULL;
     
     
                char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = "";
        int i = 0, j = 0, n = 0;
    fichier = fopen("test.txt", "r+");
    if(!fichier){
        fprintf(stderr,"No such file or directory : %s !");
        exit(EXIT_FAILURE);
    }
    else
    {
     
           n = fgetc(fichier);
     switch(n)
        {
            case '1':
                fichier = fopen("niveau.lvl", "r");
     
                break;
            case '2':
                fichier = fopen("niveau1.lvl", "r");
     
                break;
            case '3':
                fichier = fopen("niveau2.lvl", "r");
     
                break;
            case '4':
                fichier = fopen("niveau3.lvl", "r");
     
                break;
     
    }
     
            fgets(ligneFichier, 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(ligneFichier[(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;
        }
     
        int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE* fichier = NULL;
        int i = 0, j = 0;
     
        fichier = fopen("niveaux.lvl", "w");
        if(fichier != NULL)
        {
            for(i = 0; i < NB_BLOCS_LARGEUR; i++)
            {
                for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                {
                    fprintf(fichier, "%d", niveau[j][i]);
                }
            }
     
            fclose(fichier);
        }
        else
        {
            printf("Impossible d'ouvrir le fichier niveaux.lvl");
            return 0;
        }
     
        return 1;
    }
    et quand je veux y jouer dans la console il m'affiche segmentation fault
    merci d'avance

  2. #2
    Membre émérite Avatar de MythOnirie
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2012
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2012
    Messages : 376
    Par défaut
    Dans ta fonction int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR]), tu ouvre un second fichier sans avoir refermé le premier. Je ne sais pas si ça vient de là, mais ça t'empêche de refermer le premier et donc de libérer la mémoire allouée.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Sans avoir beaucoup regardé, j'accuse fgets(), qui est aussi dangereuse que gets().

    Par ailleurs, les switchs sont faux (point de vue qualité du code) car n'ont pas pas de default.

  4. #4
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut
    alors qu'est ce qui vaux mieux mettre ?

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par leternel Voir le message
    Sans avoir beaucoup regardé, j'accuse fgets(), qui est aussi dangereuse que gets().
    Non, relis le man :
    Citation Envoyé par http://man.developpez.com/man3/fgets.3.php
    char * fgets (char * s, int size, FILE * stream);
    fgets() lit au plus size - 1
    Au contraire, il est même conseillé d'utiliser fgets plutôt que gets.

    Citation Envoyé par leternel Voir le message
    Par ailleurs, les switchs sont faux (point de vue qualité du code) car n'ont pas pas de default.
    ça dépend, si le fichier ouvert est un fichier formaté, il n'y a pas besoin d'avoir un default vu qu'on est assuré qu'il n'y aura jamais d'autres valeurs que celles prévues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(i = 0; i < NB_BLOCS_LARGEUR; i++)
            {
                for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                {
                     //....
                }
             }
    Tu ne sais pas si tu as lu correctement et si il y avait bien ce nombre de caractère lus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int i=0; ligneFichier[i] ; i++)
    {
               //....
    }

    Tes switch sont inutiles :
    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
    n = fgetc(fichier);
     switch(n)
        {
            case '1':
                fichier = fopen("niveau.lvl", "r");
     
                break;
            case '2':
                fichier = fopen("niveau1.lvl", "r");
     
                break;
            case '3':
                fichier = fopen("niveau2.lvl", "r");
     
                break;
            case '4':
                fichier = fopen("niveau3.lvl", "r");
     
                break;
     
    }
    Il vaut mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * file[11];
    sscanf(file, "niveau%c.lvl", n);
    fichier = fopen(file);
    De même :
    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
    switch(ligneFichier[(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;
                    }
    C'est plus pratique de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    niveau[j][i] = ligneFichier[(i * NB_BLOCS_LARGEUR) + j] - '0';
    De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i = 0; i < NB_BLOCS_LARGEUR; i++)
            {
                for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                {
                        //....
                } 
     
    }
    On a pas forcément tout lu correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int i=0;
    for(; ligneFichier[i] ; i++)
    {
           //...
    }
    if(i != NB_BLOCS_HAUTEUR * NB_BLOCS_LARGEUR )
    {
               //erreur de lecture.
    }
    Sinon tu peux stocker tes données en binaire ainsi tu pourra remplir ton tableau d'une traite avec la fonction fread.
    Et tes fichiers seront plus petits.

  6. #6
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut
    Si je veux le stoker en binaire je fais comment ? et le code je n'arrive pas à le faire marcher
    le voici
    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
    /*fichiers.c
    ----------
     
    Par Rémi
    Rôle : fonctions de lecture / écriture de fichiers de niveau.
    */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "constantes.h"
    #include "fichiers.h"
    int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE *fichier = NULL;
     
     
                char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = "";
        int i = 0, j = 0, n = 0;
    fichier = fopen("test.txt", "r+");
    if(!fichier){
        fprintf(stderr,"No such file or directory : %s !");
        exit(EXIT_FAILURE);
    }
    else
    {
     n = fgetc(fichier);
           fclose(fichier);
     
     
    char * file[11];
    sscanf(file, "niveau%c.lvl", n);
    fichier = fopen(file,"r");
     
            fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);
            for(i = 0; i < NB_BLOCS_LARGEUR; i++)
            {
                for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                {
                    niveau[j][i] = ligneFichier[(i * NB_BLOCS_LARGEUR) + j] - '0';
                }
            }
     
            fclose(fichier);
     
     
    }
     
     
     
        return 1;
        }
     
        int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE* fichier = NULL;
        int i = 0, j = 0;
     
        fichier = fopen("niveaux.lvl", "w");
        if(fichier != NULL)
        {
            for(i = 0; i < NB_BLOCS_LARGEUR; i++)
            {
                for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                {
                    fprintf(fichier, "%d", niveau[j][i]);
                }
            }
     
            fclose(fichier);
        }
        else
        {
            printf("Impossible d'ouvrir le fichier niveaux.lvl");
            return 0;
        }
     
        return 1;
    }
    et voici 2 fois la même erreur : /usr/include/stdio.h|435|note: expected ‘const char * __restrict__’ but argument is of type ‘char **’|

    on dirai que ça vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sscanf(file, "niveau%c.lvl", n);
    fichier = fopen(file,"r");
    merci encore de m'aider

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Lors du fopen, tu rajoute "b".
    Ainsi tu aura : "rb", "wb", "ab", ....

    Tu pourras ainsi écrire tout ton tableau avec fwrite en une seule fois et le charger avec fread en un seul coup.

  8. #8
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut
    et je fais comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichier = fopen("test.txt", "rb");
    for (int i = 0, i<=20, i++)
    {
    int ni[20] = fwrite (fichier) 
    }
    non ?

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

Discussions similaires

  1. erreur segmentation fault à l'execution
    Par g.abdou dans le forum Réseau
    Réponses: 3
    Dernier message: 18/02/2011, 01h56
  2. Traiter une erreur "Segmentation Fault"
    Par Looney dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2009, 06h51
  3. erreur "Segmentation Fault" lors de l'import d'un dump
    Par farenheiit dans le forum Import/Export
    Réponses: 13
    Dernier message: 28/11/2007, 10h17
  4. Réponses: 2
    Dernier message: 08/04/2007, 17h23
  5. [erreur] Segmentation fault
    Par fveysseire dans le forum C
    Réponses: 11
    Dernier message: 15/06/2006, 14h44

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