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 dans la déclaration?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 15
    Par défaut erreur dans la déclaration?
    Bonjour,

    Je débute et j'ai une erreur (segmentation fault) que je n'arrive pas à résoudre.
    Merci pour l'aide.

    Voici mon programme :

    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
     
    # include <stdio.h>
    main ()
    {
    FILE *pano;
    FILE *noke;
    FILE *dodo;
    char transf[10];
    char denomb[10];
    char bon[10];
    /*
     
     
     
    */
     
    unsigned short n;
    unsigned long m,x,i,y;
    unsigned long xab[359000][10];
    unsigned long tab[400];
    pano = fopen ("transf","w");
    noke = fopen ("/Users/X/denomb","r");
    dodo = fopen ("/Users/X/bon","r");
    scanf("%lu",&x);
    for(m=0;m<x;m++) {
     for(n=0;n<10;n++) {
      fscanf(noke,"%lu",&xab[m][n]);
      }
       }
     
    scanf("%lu",&y);
    for(i=0;i<y;i++) {
      fscanf(dodo,"%lu",&tab[i]);
      }
     
     
    for(i=0;i<y;i++)
      {
       m=tab[i];
     
    fprintf(pano, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", xab[m-1][0],xab[m-1][1],xab[m-1][2],xab[m-1][3],xab[m-1][4],xab[m-1][5],xab[m-1][6],xab[m-1][7],xab[m-1][8],xab[m-1][9]);
    }
     
    fin:
    fclose (dodo);
    fclose (noke);
    fclose (pano);
    printf("fin");
     
    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Par défaut
    Bonsoir.

    Ton code serait plus lisible s'il était indenté et que tu utilisais la balise code.

    J'ai pas regardé tout ton code mais il plante au minimum à cause de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned long xab[359000][10];
    Déclaré ainsi dans la fonction main, le tableau est alloué sur la pile et vue sa taille tu dépasse sa limite.

    Tu peux donc allouer ton tableau sur le tas avec malloc() ou le déclarer static dans ton main.

  3. #3
    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
    Ce n'est pas ça qui le fait planter sinon l'erreur serait un stack overflow si je ne m'abuse (de plus son tableau ne fait que 27,39Mo).
    Mais il serait peut être bien d'utiliser une table de hachage contenant des tableaux alloué dynamiquement, ceci serais sûrement plus pratique niveau mémoire.

    L'erreur de segmentation peut venir de plusieurs choses :
    Tu demande à l'utilisateur d'entrer une taille pour le tableau, autant déclarer tes tableaux par rapport à cette taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scanf("%lu",&x);
    unsigned long xab[x][10];
    Ceci évitera que x soit plus grand que le nombre de ligne de ton tableau et de n'allouer que la taille nécessaire.

    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    m=tab[i];
     
    fprintf(pano, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", xab[m-1][0],xab[m-1][1],xab[m-1][2],xab[m-1][3],xab[m-1][4],xab[m-1][5],xab[m-1][6],xab[m-1][7],xab[m-1][8],xab[m-1][9]);
    Je serais d'avis de tester la taille de m.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    m=tab[i];
     
    if(m > x)
    {
               printf(stderr, "Erreur m trop grand, tab[%d] = %lu\n", i, m);
               continu;
    }
    m--; // c'est plus pratique
    fprintf(pano, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", xab[m][0],xab[m][1],xab[m][2],xab[m][3],xab[m][4],xab[m][5],xab[m][6],xab[m][7],xab[m][8],xab[m][9]);

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Ce n'est pas ça qui le fait planter sinon l'erreur serait un stack overflow si je ne m'abuse
    Tiens, chez moi si je m'amuse à faire un tableau trop grand j'ai une erreur de segmentation, j'y avais jamais réfléchi mais un stack overflow serait peut être plus logique effectivement, bizarre, si quelqu'un est spécialiste de la question...

    Sinon, j'y vais de ma petite hypothèse : les fichiers : le fscanf est un outil très sensible si jamais les fichiers ne sont pas formatés exactement comme prévu l'erreur de segmentation n'est jamais très loin, de plus les ouvertures de fichiers ne donnent lieu à aucun test, si jamais un fichier est absent ou a des droits ne permettant pas sa lecture par l'utilisateur courant...

    Il est fortement conseillé de toujours vérifier que le résultat d'un fopent est !=NULL avant d'effectuer des traitement sur celui-ci

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Un petit passage par Valgrind ou Dr Memory peut aider

    Je serais aussi d'avis de tester les retours de fopen() pour garantir la bonne ouverture des fichiers. (Edit : chui pas assez réveillé, c'est écrit juste au-dessus).

  6. #6
    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
    le fscanf est un outil très sensible si jamais les fichiers ne sont pas formatés exactement comme prévu l'erreur de segmentation n'est jamais très loin
    fscanf retourne le nombre d'élément lu, on peut donc s'en servir pour voir s'il n'y a pas une erreur.

    Mais je pense que le mieux serait de rajouter un petit if dans les boucles de lecture pour vérifier qu'on arrive pas en fin de fichier (feof) ou qu'il n'y ai pas eu d'erreur lors de la lecture (ferror il me semble).

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Oui, c'est ferror()

    Voir aussi la FAQ.

  8. #8
    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
    Par défaut
    Citation Envoyé par mator Voir le message
    Bonjour,

    Je débute et j'ai une erreur (segmentation fault) que je n'arrive pas à résoudre.
    Tu ne verifies aucun code de retour, tu lis les entrees clavier avec scanf, et tu ne nous dis pas a quel moment ton programme plante.

    Avant d'aller plus loin, corrige ces erreurs, lis un tuto ou deux sur les entrees comme http://emmanuel-delahaye.developpez....ees-solides-c/, et dis nous quand ton programme plante.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Not Found

    The requested URL /inputs.html was not found on this server.
    Ce n'est pas très gentil de ta part, gangsoleil

    http://emmanuel-delahaye.developpez....ees-solides-c/

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @Neckara
    Ce n'est pas ça qui le fait planter sinon l'erreur serait un stack overflow si je ne m'abuse (de plus son tableau ne fait que 27,39Mo).
    C'est déjà beaucoup et souvent la taille maximum de la pile par défaut est bien inférieure. Quant au message d'erreur, il dépend du système utilisé qui peut très bien signaler un "segmentation fault" dans ce cas.

    Mon avis est, avant d'aller chercher plus loin, de mettre ce tableau en global et de voir ce qui se passe.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void f(int t[][100])
    {
        printf("%d", t[0][0]);
    }
     
    int tableau[10000][100];
     
    int main(void){
     
        // int tableau[10000][100]; // crash si déclaré ici
        f(tableau);
        return 0;
    }
    Je suis surpris par ce comportement... Ca crashe si tableau est déclaré dans le main() mais pas s'il est global. Pourtant, il devrait être copié de la même manière en paramètre de f(), non ?

  12. #12
    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
    Je pense qu'il ne copie que le pointeur non?

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Effectivement, seule l'adresse du premier élément du tableau est transmise, pas le tableau. D'où l'ambiguité de cette notation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void f(int t[][100])
    {
    ....
    }
    Alors que le véritable type de t est int (*t)[100]

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Par défaut
    Citation Envoyé par Bktero
    Je suis surpris par ce comportement... Ca crashe si tableau est déclaré dans le main() mais pas s'il est global. Pourtant, il devrait être copié de la même manière en paramètre de f(), non ?
    Un tableau n'est jamais copié d'après cette entrée de la FAQ : http://c.developpez.com/faq/?page=ta...leau_parametre

Discussions similaires

  1. Erreur dans la déclaration Clés étrangères
    Par Ellia dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2012, 17h03
  2. erreur dans la déclaration d'une fonction
    Par batoule80 dans le forum Débuter
    Réponses: 1
    Dernier message: 03/03/2010, 19h29
  3. Déclaration des erreurs dans l'ActionForm
    Par VolaiL dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/01/2009, 16h45
  4. Des erreurs dans la déclaration d'une enum
    Par moooona dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2008, 04h33
  5. Erreur dans la déclaration d'un curseur
    Par adam57 dans le forum Forms
    Réponses: 10
    Dernier message: 24/04/2008, 17h35

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