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 :

"Core dumped" en relation avec un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 10
    Par défaut "Core dumped" en relation avec un tableau
    Bonjour,


    Je me trouve confrontée à un problème lié à l'utilisation de pointeurs.

    En effet, en exécutant la fonction [ci-dessous], à l'aide de tests, un message d'erreur apparaît : "core dumped".

    Manipulant les tableaux, j'ai de suite pensé à la notion d'indice et donc l'accès à un espace mémoire non alloué.

    Cependant, après différentes tentatives, je reste bloquée, sans trouver la cause de ce "core dumped".


    Le but de la fonction est de convertir une chaine en naturel (ou plutôt en "grand naturel" puisqu'il s'agit d'utiliser des grands nombres).

    Je posède la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     typedef struct GN_GrandNaturel {
      unsigned int nbChiffres;
      LCDC_ListeChainee chiffres;
    } GN_GrandNaturel;

    Et voici la fonction que j'ai codé :

    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
     GN_GrandNaturel GN_chaineEnGrandNaturel(char* ch) {
      GN_GrandNaturel res;
      int i;
     
      assert((strlen(ch)>0) && (GN_composeUniquementDeChiffres(ch)));
     
      res.chiffres = LCDC_listeChainee();
      res.nbChiffres=0;
     
      for (i=0; i<strlen(ch); i++){
        if ((ch[i] != '0') || (res.nbChiffres != 0) || ((ch[i]='0') && (res.nbChiffres=0) && (i=strlen(ch)))){
          res.nbChiffres=res.nbChiffres+1;
          LCDC_ajouter(&(res.chiffres),ch[i]);
        }
      }
      return res;
    }

    Serait-il possible de me donner des pistes de réflexions quant-à cette erreur ?

    Merci d'avance pour vos réponses,

    Alexia.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Attention, pour vérifier l'égalité entre 2 nombres c'est l'opérateur ==, l'utilisation ligne 11 à la place de = aurait dû provoquer des 'warnings' de ton compilateur.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    ce code mais ce code

    • Pour chaque tour de boucle, tu appelles 2 fois la fonction strlen et à chaque appel c'est 1 parcours complet de la chaîne - il faut stocker cette longueur
    • (ch[i] != '0') - tu prends tous les chiffres sauf les 0 dans le nombre
    • (res.nbChiffres != 0) - ce test ne sert à rien sauf la 1ière fois, parce que ton nombre augmente
    • (ch[i]='0'), (res.nbChiffres=0) et i=strlen(ch) - voir la réponse de @dalfab
    • res.nbChiffres=res.nbChiffres+1; - C'est la fonction LCDC_ajouter qui doit faire l'incrémentation
    • res.chiffres = LCDC_listeChainee(); res.nbChiffres=0; - il faut coder 1 fonction LCDC_init

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Alexia-Prog Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      for (i=0; i<strlen(ch); i++){
        if ((ch[i] != '0') || (res.nbChiffres != 0) || ((ch[i]='0') && (res.nbChiffres=0) && (i=strlen(ch)))){
    En plus de tout ce qu'on t'a dit sur strlen(ch) qui est appelé 2 fois à chaque tour de boucle (pour n chiffres tu fais 2n² itérations !!!) et la confusion entre "=" et "==", il y a aussi une erreur de logique plutôt évidente (ou de compréhension des mots et de ce que ça entraine). Si i est inférieur à strlen(ch), alors il ne peut pas être égal à strlen(ch).
    De plus tester "x différent de 0 ou (x égal zéro et autres trucs)" se réduit assez simplement à "x différent de zéro ou autres trucs"... Ceci dit, je ne pige rien à ce que tu veux faire avec ce test interminable. Puisque tu t'es assuré que toute la chaine ne contient que des chiffres, te suffit de les traiter un par un sans te poser de question.
    Accessoirement assert((strlen(ch)>0) (allez, une boucle de plus sur la chaine) pourra s'écrire assert(*ch != '\0').

    Citation Envoyé par Alexia-Prog Voir le message
    Serait-il possible de me donner des pistes de réflexions quant-à cette erreur ?
    Tu as déjà posé cette question. A questions identiques, réponses identiques: printf().
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (i=0; i<strlen(ch); i++){
        if ((ch[i] != '0') || (res.nbChiffres != 0) || ((ch[i]='0') && (res.nbChiffres=0) && (i=strlen(ch)))){
          res.nbChiffres=res.nbChiffres+1;
          LCDC_ajouter(&(res.chiffres),ch[i]);
        }
      }
    Sais-tu ce que tu écris ou le copies-tu au petit bonheur de n'importe où/qui ?
    Ton code tente de faire une boucle de 0 à taille de chaîne - 1 (ce qui est mal mais un classique de débutant, voir ci-dessus), puis tu vérifies que le caractère soit pas 0 (mettons que ça soit justifié), puis que nbChiffres soit pas nul (pour quoi ?), puis tu mets ce caractère à 0 , puis tu réinitialises nbChiffres à 0 , puis tu assignes taille de la chaîne à i .
    La ligne d'après, tu initialises donc nbChiffres à 1 (vu qu'il est initialisé à 0 juste au-dessus, l'incrémentation a pas d'autre d'effet), avant de chercher le i-ème caractère d'une chaîne de i caractères, ce qui explose bien évidemment puisque tu es hors bornes.


    Au passage, si tu es la responsable des -1 sur ces posts... ça donne pas envie de consacrer du temps à t'aider. Mais si ce sont les tiens, tu peux y remédier.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 10
    Par défaut
    Bonjour,

    Tout d'abord merci pour toutes vos réponses !

    En effet, je ne demande qu'à apprendre et à m'améliorer.

    J'ai pris en compte toutes vos remarques :
    • @dalfab en effet, erreur de ma part !
    • @foetus, La fonction ajouter (telle que coder) n'incrémente pas, donc je suis obligée de le faire dans cette fonction là.
      [I](ch != '0') - tu prends tous les chiffres sauf les 0 dans le nombre : en fait je souhaitais prendre dans que je la chaine n'est pas fini. Or, le caractère de fin de chaîne se traduit par "\0". Ne sachant pas comment l'exprimer, je m'étais renseignée sur des forums et ils semblaient dire qu'on pouvait le traduire seulement par "0". Cependant, j'ai eu ma réponse avec @Sve@r.
    • @Bousk, quand tu dis "ce qui est mal mais un classique de débutant", et "avant de chercher le i-ème caractère d'une chaîne de i caractères", peux-tu m'expliquer ?
      Et non, je ne sais même pas comment mettre les "-1"....


    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
    GN_GrandNaturel GN_chaineEnGrandNaturel(char* ch) {
      GN_GrandNaturel res;
      int i;
      int longueurChaine;
     
      assert((strlen(ch)>0) && (GN_composeUniquementDeChiffres(ch)));
     
      res.chiffres = LCDC_listeChainee();
      res.nbChiffres=0;
     
      longueurChaine =strlen(ch);
      for (i=0; i<longueurChaine; i++){
        if ((ch[i] != '\0') || (res.nbChiffres != 0) || ((ch[i]=='0') && (res.nbChiffres=0) && (i==longueurChaine))){
          res.nbChiffres=res.nbChiffres+1;
          LCDC_ajouter(&(res.chiffres),ch[i]);
        }
      }
      return res;
     
    }


    Encore merci pour votre aide !

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Alexia-Prog Voir le message
    [I](ch != '0') - tu prends tous les chiffres sauf les 0 dans le nombre : en fait je souhaitais prendre dans que je la chaine n'est pas fini. Or, le caractère de fin de chaîne se traduit par "\0". Ne sachant pas comment l'exprimer, je m'étais renseignée sur des forums et ils semblaient dire qu'on pouvait le traduire seulement par "0"
    il ne faut pas confondre le caractère '0' (valeur ascii 48) et le caractère '\0' (valeur ascii 0).

    Citation Envoyé par Alexia-Prog Voir le message
    quand tu dis "ce qui est mal mais un classique de débutant", et "avant de chercher le i-ème caractère d'une chaîne de i caractères", peux-tu m'expliquer ?
    Les indices d'un tableau commencent à 0. Un tableau de (par exemple) 5 éléments sera indicé 0, 1, 2, 3 et 4. Il s'ensuit que quelle que soit la taille "t" d'un tableau, les indices vont de 0 à "t-1" et l'indice "t" est toujours hors champ.

    Citation Envoyé par Alexia-Prog Voir le message
    Et non, je ne sais même pas comment mettre les "-1"....
    Là je ne vois pas ce que tu veux dire. Mais comme tu t'adresses à Bousk, peut-être lui verra mieux

    Citation Envoyé par Alexia-Prog Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      longueurChaine =strlen(ch);
      for (i=0; i<longueurChaine; i++){
        if ((ch[i] != '\0') || (res.nbChiffres != 0) || ((ch[i]=='0') && (res.nbChiffres=0) && (i==longueurChaine))){
          res.nbChiffres=res.nbChiffres+1;
          LCDC_ajouter(&(res.chiffres),ch[i]);
        }
      }
      return res;
     
    }
    C'est mieux. Au-moins strlen() n'est appelé qu'une fois. Tu peux ensuite l'éliminer totalement en passant par un pointeur
    Exemple classique
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int lg=strlen(ch);
    for (i=0; i < lg; i++)
    	traitement ch[i]

    Exemple avec pointeur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *pt;
    for (pt=ch; *pt != '\0'; pt++)
    	traitement *pt;			// *pt contient la même chose que ch[i]
    C'est plus rapide car 1) strlen() (qui fait un balayage complet de la chaine) n'est même pas invoquée, et 2) récupérer une case directement pointée est plus rapide que passer par un indice qui oblige à se placer au début du tableau et à décaler ensuite (enfin il y a ici un petit désaccord entre nous car certains soutiennent que le compilateur arrive à détecter ce genre de boucle et à remplacer lui-même l'indice par un pointeur).

    Et on peut même faire les deux à la fois (utiliser l'indice pour savoir quand s'arrêter et utiliser le pointeur pour récupérer l'élément)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *pt;
    int i;
    for (i=0, pt=ch; i < taille_tableau; i++, pt++)
    	traitement *pt;

    Maintenant je reste sec quant au but de ce test if (ch[i] != '\0'). strlen() s'arrête au premier '\0' rencontré. Si ce '\0' se trouve au 20° caractère, cela veut dire que les 19 premiers n'ont pas de '\0'. Et comme ta boucle va de 0 jusqu'à la valeur de strlen() (donc 19 dans mon exemple), ch[i] ne peut pas contenir '\0' donc cette partie sera toujours vraie donc inutile. Peut-être que tu devrais nous exprimer ce que tu cherches à vérifier ici.

    Citation Envoyé par Alexia-Prog Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i=0; i<longueurChaine; i++){
        if (... && (i==longueurChaine))){
    }
    Là rien ne change par rapport au post précédent. Si i reste inférieur à longueurChaine, i ne peut pas être égal à longueurChaine. Et comme c'est un "et", le test complet devient définitivement et irrémédiablement faux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 10
    Par défaut
    Merci Sve@r pour ton aide !

    J'ai réussi à :
    • Comprendre mes erreurs,
    • Améliorer ma compréhension, en général, de l'utilisation des chaîne de caractère,
    • Résoudre mon problème.


    Je me permets un autre petite question sur le même sujet.
    Si, maintenant, je souhaite effectuer l'inverse : convertir un nombre en chaîne de caractère. Est-ce que la démarche suivante est pertinente :
    • "extraire" chaque chiffre du nombre, avec l'opération "modulo"
    • créer une liste chainée de caractères
    • Insérer un à un les chiffres dans la liste chaînée

Discussions similaires

  1. (debutant) Core Dumped ?
    Par pouic06 dans le forum Débuter
    Réponses: 8
    Dernier message: 09/11/2008, 13h01
  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