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 :

(debutant) Core Dumped ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut (debutant) Core Dumped ?
    Bonjour ... je voudrais savoir pourquoi ce 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
     
    int main () {
      cout << "On cree les personnes suivantes\n";
      const char* prenoms1[] = {"Marcel", "Firmin", "Gaston", 0};
      const Personne marcel ("Meharcele",  prenoms1, 78);
      Afficher (marcel);
     
      const char* prenoms2[] = {"Lea", "Germaine", 0};
      const Personne lea ("Tralala",  prenoms2, 45);
      Afficher (lea);
     
      // et si vous aviez raté quelque chose sur le constructeur
      prenoms1[0] = "Claudia"; prenoms1[1] = 0;
      Personne claudia ("Choufleur",  prenoms1, 31);
      Afficher (claudia);
    l'entete de la classe Personne :
    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
     
    class Personne {
     
    public :
    Personne(const char* ,const char** ,int );
    const char* Nom() const;
    const char* PremierPrenom() const ;
    const char** TousLesPrenoms() const ;
    int Age() const ;
     
    private :
    const char* nom ;
    const char** prenoms;
    int age ;
     
    };
    avec ce constructeur dans la classe personne :
    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
     
    Personne::Personne(char* leNom , const char** lesPrenoms , int lage) {
     
     
    nom = strdup(leNom) ;
     
    int i=0;
    while(lesPrenoms[i] != 0) { i++;}
     
    int j=0;
    while (j != i) { 
    prenoms[j] = strdup(lesPrenoms[j]) ;;
    j++;
    }
    prenoms[j]=0;
     
    age = lage ;
     
    }
    provoque cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    On cree les personnes suivantes
     Firmin (Firmin, Gaston) Meharcele, 78 ans
     Germaine (Germaine) Tralala, 45 ans
    Erreur de segmentation (core dumped)
    Merci d'avance

  2. #2
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Déjà le nom de l'erreur c'est "Erreur de segmentation", Core dump ça doit vouloir dire, mais je ne suis pas sur, qu'un fichier core (fichier d'erreur) a été écrit.

    Ensuite les erreurs de segmentation apparraissent trés souvent quand on commence à s'amuser avec les pointeurs: donc essaye de les éviter quand c'est possible.

    Tu peux les éviter en utilisant:
    - string à la place de char*
    - vector à la place des tableaux de base du langage

    Mais bon tout ça a déjà été dit des centaines de fois sur ce forum .

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (j != i) { 
    prenoms[j] = strdup(lesPrenoms[j]) ;;
    j++;
    }
    prenoms[j]=0;

    tu n'alloue nulle part de la mémoire pour prenoms.
    et je crois sauf erreur de ma part qu'il y a des const en trop

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    tu n'alloue nulle part de la mémoire pour prenoms.
    et je crois sauf erreur de ma part qu'il y a des const en trop
    Je crois que strdup alloue lui meme la memoire pour la chaine de caracteres .

    Tu peux les éviter en utilisant:
    - string à la place de char*
    - vector à la place des tableaux de base du langage
    Non je peux pas , c'est dans le cadre d'un TP et le code dans le main je peux pas le changer

    Déjà le nom de l'erreur c'est "Erreur de segmentation", Core dump ça doit vouloir dire, mais je ne suis pas sur, qu'un fichier core (fichier d'erreur) a été écrit.
    Il se trouve où ce fichier ?

  5. #5
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Coca25 parlait des "cases" pour prenoms (ton tableau) pas les chaines allouées par strdup.

    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
     
    Personne::Personne(char* leNom , const char** lesPrenoms , int lage) {
    nom = strdup(leNom) ;
     
    int i=0;
    while(lesPrenoms[i] != 0) { i++;}
     
    int j=0;
    prenoms = new char*[i+1]; // quelque chose comme ça à ajouter
    while (j != i) { 
    prenoms[j] = strdup(lesPrenoms[j]) ;;
    j++;
    }
    prenoms[j]=0;
     
    age = lage ;
     
    }
    Sinon, si tu ne veux pas utiliser vector,
    tu pourras toujours corriger les bugs ( pas de destructeur, constructeur de copie et affectation manquants)

    Si le main ne peut pas changer, change ta classe

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    oui j'avais pensé à mettre ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     prenom = new char*[i+1];
    mais le compilateur me dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    personne.cc: In constructor ‘Personne::Personne(const char*, const char**, int)’:
    personne.cc:13: error: ‘prenom’ was not declared in this scope
    make: *** [personne.o] Erreur 1

  7. #7
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    c'est sûrement "prenoms" et non pas "prenom"

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    Loooooool ! trés juste , ça va beaucoup mieu d'un coup

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Par défaut
    Bonjour à tous,

    Moi aussi j'ai une erreur de segmentation core dumped, mais je n'arrive pas à détecter l'erreur.

    Voilà ce que je veux faire :

    1 - Aller chercher dans un fichier une ligne par exemple : "etat1 etat2 etat3 e4 e5#" (espaces compris)

    2 - Maintenant, je voudrais créer un tableau de 5 pointeurs. Chaque pointeur, pointera sur chacune des chaines de caractères. Autrement dit, si on appelle, le tableau : tab_pointeurs, on aura :

    tab_pointeurs[0] qui pointe sur "etat1"
    tab_pointeurs[1] qui pointe sur "etat2"
    ......
    tab_pointeurs[4] qui pointe sur "e5"

    SEULEMENT, on ne sait pas à l'avance combien d'états on aura dans le fichier, et donc de combien de pointeurs on aura besoin. Et on ne sait pas non plus quelle taille feront chaque chaine de caractères. D'où les allocations mémoires.

    Je ne sais pas si le problème est assez clair .


    Voilà la portion de 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
    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
     
    typedef char* t_etats;
    'etats' est une variable globale. Un tableau de 500 caractères maxi qui contiendra toute la ligne du fichier (espaces compris).
    i est la variable qui permet de se déplacer dans ce tableau.
     
    //////////////////////////////////////// FONCTION RECHERCHER_ETATS ///////////////////////////////////////////////
    /*  
     * Recherche les états de la machine dans le fichier 'machine'.
     * Préconditions : Le fichier existe
     * Postconditions : Renvoie un tableau de chaîne de caractères (les états).
    */
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    t_etats* rechercher_etats(FILE* fichier){
     
        char marqueur = '$'; t_etats* etats_ret=NULL;
     
        /* Parcours du fichier ligne par ligne. On sort de la boucle une fois le mot trouvé.*/
        while (!feof(fichier)){
     
              fgets(etats,sizeof(etats),fichier);           
              if(etats[0] != marqueur){
                    break;  
              }  
        }
        printf("Etats recherches : %s",etats);
        printf("Taille : %d\n",strlen(etats)-2); // on enlève le '#' et le marqueur de fin '\0'
        int unsigned i=0; int j=0; int unsigned k=0; int maxetats=0; int taille_nom_etat=0; int t=0;
     
        // On compte le nombre total d'états présents pour la machine. En comptant le nombre d'espace entre leurs noms et en ajoutant 1.
        while(k<strlen(etats)-2){
           if(etats[k]==' '){  
              maxetats++;  
           }
           k++;
        }
        maxetats++;
        printf("nbre d'etats : %d\n",maxetats);
     
        /* tab_etat est un tableau de pointeurs. Sa taille (maxetats) n'est pas connue à l'avance. Mais, on en aura besoin un peu plus haut
         * dans la fonction "indice_etat". Sa taille réelle est contenue dans la variable maxetats et on ajoute une case de plus qui
         * contiendra toujours NULL. Cette case jouera le rôle de marqueur de fin et nous permettra à l'aide d'une boucle de déterminer la
         * taille du tableau. Les indices vont de 0 à maxetats-1. Donc, si on ajoute une colonne de plus, elle aura pour indice 'maxetats'.
         */
        t_etats tab_etat[maxetats+1]; tab_etat[maxetats]=NULL;
     
        for(j=0;j<maxetats;j++){
     
    	  /* On compte la taille en caracteres de chaque etat.
    	   * strlen(mot)-2 pour éviter de prendre le dernier caractère de la chaine # et le marqueur de fin : '\0'.
    	   */                     
    	   while(etats[i]!=' ' && i<strlen(etats)-2){
    	         i++;              
                   taille_nom_etat++;                                                                     
    	    }
    	    printf("taille du nom de l'etat = %d\n",taille_nom_etat);
    	    //size_t n = taille_nom_etat;
    	    /*
    	     * Pour chaque état, on alloue une zone mémoire de taille variable qui contiendra son nom (chaine de caractère qui le
    	     * représente). Ceci, en partant du principe que les noms (des états) i.e les chaines de caractère sont de tailles différentes.
    	     *
    	     * Si  par exemple, nous avons les états : 'etat1' 'etat2', 'e3', 'q4', 'eta5'
    	     * On allouera :
    	     * Une zone mémoire de 5 caractères pour chacun des états 1 et 2. 
    	     * Une zone de 2 caractères pour chacun des états 3 et 4 et
                * Une zone de 4 caractères pour l'état 5.
    	     * tab_etat est un tableau de pointeurs sur ces caractères. Donc,
    	     * tab_etat[0] pointera sur l'état 1 et donc sur la chaîne : 'etat1'
    	     * tab_etat[1] pointera sur l'état 2 et donc sur la chaîne : 'etat2'
    	     * tab_etat[2] pointera sur l'état 3 et donc sur la chaîne : 'e2'
    	     * tab_etat[3] pointera sur l'état 4 et donc sur la chaîne : 'q4'
    	     * tab_etat[4] pointera sur l'état 5 et donc sur la chaîne : 'eta5'
    	     */
    	     tab_etat[j] = malloc(sizeof(char)*taille_nom_etat);
    	     if(tab_etat[j]==NULL){
    	         printf("\n Allocation Impossible \n");
    	         exit(EXIT_FAILURE);
    	     }
    	     //printf("i = %d\n",i);
    	     int temp; temp = taille_nom_etat; int taille; taille = strlen(etats)-2;
    	     if(i <= taille){
    	          for(t=0;t<taille_nom_etat;t++){
    	               tab_etat[j][t]=etats[i-temp];
    	               temp--;
    	          }
    	      }
    	      i++;
    	      taille_nom_etat=0;              
         }               
     
         printf("Les etats sont : \n");
         for(j=0;j<maxetats;j++){
              printf("%s\n",tab_etat[j]);  
         }
         //system("PAUSE");
         printf("\n");
         etats_ret = tab_etat;
         return etats_ret;
    }
    // Fin de la fonction rechercher_etats
    Merci d'avance,

    AR

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

Discussions similaires

  1. Core Dump - Kernel
    Par jc_isd dans le forum Administration système
    Réponses: 5
    Dernier message: 22/01/2007, 17h54
  2. Réponses: 1
    Dernier message: 10/12/2006, 21h37
  3. Comment générer un core dump en c
    Par gege2061 dans le forum Linux
    Réponses: 3
    Dernier message: 12/11/2006, 15h33
  4. Problème de Core Dumped !
    Par KneXtasY dans le forum C
    Réponses: 8
    Dernier message: 24/12/2005, 13h11
  5. Segmentation fault (core dumped)
    Par Battosaiii dans le forum C
    Réponses: 13
    Dernier message: 25/11/2005, 18h36

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