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 :

Probleme de pointeur


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut Probleme de pointeur
    Bonjour à tous

    Ecoutez je suis un débutant en Langage C et j'aimerais bénéficiez de votre aide concernant quelque problème sur les pointeurs et les listes.

    En faite, je dois extraire d'un fichier une lettre ainsi que son code Morse que je doios ajouter dans une liste.
    Le porblème c'est que ça ne fonctionne pas, ne ne voi pas l'erreur de pointeur.
    Si vous pouviez m'aider ce serai gentil
    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
     
    void Ajouter_en_Fin(char c,char *m,Liste *l)
    {
    	Liste p=NULL;
    	Liste q=NULL;
     
    	if (estVide(*l)==vrai)
    	{
    		p= (Liste) malloc(sizeof(Element));
    		p->c=c;
    		strcpy(p->morse,m);
    		p->suiv=NULL;
    		*l=p;
    	}
    	else
    	{
    		for(p=*l;p->suiv;p=p->suiv)
    		;
     
    		q= (Liste) malloc(sizeof(Element));
    		q->c=c;
    		strcpy(q->morse,m);
    		q->suiv=NULL;
    		p->suiv=q;
    	}	
    }

  2. #2
    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
    Cette partie de code a l'air correct. Comment sont déclarés Element et Liste et comment est le code qui appelle la fonction ?

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Code de la déclaration de liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct element
    {
    	char c;
    	char *morse;
    	struct element* suiv;
    };
     
    typedef struct element Element;
    typedef Element* Liste;
    Code à l'appel
    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
     
    main()
    {
    	FILE *fp;
    	char c;
    	char ligne[100];
     
    	char car;
    	int j;
    	char *code;
     
     
    	Liste l=NULL;
     
     
    	fp=fopen(FICHIER,"r");
    	if(fp==NULL) printf("Fichier existe pas\n");
    	else
    	{
     
    		c=fscanf(fp,"%c %s\n",&car,ligne);
    		while(c!=EOF)
    		{	
    			j=strlen(ligne)+1;
    			code=(char*) malloc(sizeof(char)*j);
    			strcpy(code, ligne);
    			Afficher_liste(l);
     
    			/***Travaille sur liste ****/
    			Ajouter_en_Fin(car,code,&l);
    			/***************************/
     
    			c=fscanf(fp,"%c %s\n",&car,ligne);
    		}
    		fclose(fp);
    	}
     
    	Afficher_liste(l);
    }
    Voila ce que je fait à l'appel.
    En faite j'extrait d'un fichier "code.txt"(FICHIER) qui contient :
    A .-
    B ..-
    etc..

    et je rempli avec a liste .L'extraction fonctionne très bien je les testé à part mais c'est au moment ou je fait appel à Ajouter_en_Fin(car,code,&l); que ca pose probleme

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Problème habituelle, p->morse est un pointeur vers une chaîne de caractères celà veut dire que sa valeur est l'adresse d'une chaîne de caractères.Or tu n'initialises pas ce pointeur, donc tu écris "dans la nature" avec ton Il faut faire comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             code=(char*) malloc(sizeof(char)*j); 
             strcpy(code, ligne);
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct element 
    { 
    char c; 
    char *morse; 
    struct element* suiv; 
    };
    ...
    void Ajouter_en_Fin(char c,char *m,Liste *l) 
    {
    ....
    strcpy(p->morse,m);
    ....
    Aucune place mémoire n'a été allouée pour ranger les caractères de m. Soit morse doit être un tableau de caractères,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct element 
    { 
    char c; 
    char morse[4]; 
    struct element* suiv; 
    };
    soit morse doit contenir l'adresse d'un tableau alloué dynamiquement dans la fonction Ajouter_en_Fin avant strcpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p->morse = malloc(strlen(m)+1);
    strcpy(p->morse,m);
    Accessoirement, le code de la fonction comporte beaucoup de duplication et il faudrait y mettre un peu d'ordre.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Je suis désolé mais je ne compren pas je dois faire comme la ligne que tu ma montré dans Ajouter_En_Fin(..) c'est bien cela et à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy(p->morse,m);
    Je devrais mettre ceci alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    p->morse=(char*) malloc(sizeof(char)*strlen(m));
    strcpy(p->morse,m);
    C'est ce que j'ai compris

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Diogene

    Ben en faite nous somme obligé d'utilisé un pointeur dans la structure element pour morse.
    Ceci m'a eté imposé et donc l'utilisation de tableau n'est pas admise.
    C'est pourquoi j'utilise les pointeurs

  8. #8
    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
    morse est déclaré comme un pointeur sur char (char *) Sa vocation est de stocker une adresse de char pas des char ce que tu fais avec strcpy(p->morse,m);
    Donc, on alloue une place mémoire pour ranger les char et on met l'adresse de la zone mémoire obtenue dans ce pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p->morse = malloc(strlen(m)+1);
    strlen(m) donne le nombre de caractères de la chaîne m à ranger et le +1 (a ne pas oublier) est pour la valeur 0 qui termine la chaîne.
    A noter que sizeof(char) valant 1, il est inutile (mais pas faux) de le mettre et que le transtypage du retour de malloc est inutile (mais pas faux)
    en en faite nous somme obligé d'utilisé un pointeur dans la structure element pour morse.
    Ceci m'a eté imposé et donc l'utilisation de tableau n'est pas admise.
    Donc il faut l'allocation dynamique

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Je compre, ce que tu me dis.
    Mais le malloc + 1 a deja été fait tu peu regarder plus haut au moment ou j'affecte une valeur a j je lui ajoute 1 pour '\0' c'est pourquoi je le fais pas dans Ajoute_En_Fin

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Voici les derniere modifs effectuer

    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
     
    void Ajouter_en_Fin(char c,char *m,Liste *l)
    {
    	Liste p=NULL;
    	Liste q=NULL;
     
    	if (estVide(*l)==vrai)
    	{
    		p= (Liste) malloc(sizeof(Element));
    		p->c=c;
    		p->morse=malloc(strlen(m));
    		strcpy(p->morse,m); 
    		p->suiv=NULL;
    		*l=p;
    	}
    	else
    	{
    		for(p=*l;p->suiv;p=p->suiv)
    		;
     
    		q= (Liste) malloc(sizeof(Element));
    		q->c=c;
    		q->morse=malloc(strlen(m));
    		strcpy(q->morse,m); 
    		q->suiv=NULL;
    		p->suiv=q;
    	}	
    }
    L'appel est toujours le meme ,je n'ai rien a y changer
    Malgré ces petis changement j'ai toujour les meme soucis de pointeurs et l'erreur est toujour la meme "Segmentation fault"
    J'arriva pas à capter l'erreur malgré tous les changements effectué, Grace a ton explication Diogene je voit mieux le problème mais je pensait l'avoir résolu alors que non

  11. #11
    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
    Mais le malloc + 1 a deja été fait tu peu regarder plus haut au moment ou j'affecte une valeur a j je lui ajoute 1 pour '\0' c'est pourquoi je le fais pas dans Ajoute_En_Fin
    Ceci est fait dans le main pour créer un tableau que tu appelles code. Ceci ne crée pas un tableau pour (chaque) Element pour copier ta chaîne. Et tu dois la copier donc créer une chaîne nouvelle pour chaque Element: tu ne peux te contenter de copier l'adresse qui est dans code dans morse style p->morse = m (sinon, tous les Elements auraient la même chaîne)

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    D'autre part on t'as dit de mettre strlen(m)+1 dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    q->morse=malloc(strlen(m));
    Il faut de la place pour le zéro termnial des chaînes de caractères.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Ben maintenant ça fonctionne avec ce code ci :

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define FICHIER "code.txt"
     
     
    #define faux 0
    #define vrai 1
    typedef int boolean;
     
    struct element
    {
         char c;
      char *morse;
        struct element* suiv;
    };
     
    typedef struct element Element;
    typedef Element* Liste;
     
    boolean estVide(Liste l)
    {
    	if (l==NULL) return vrai;
    	else return faux;
    }
     
    void Ajouter_en_Fin(char c,char *m,Liste *l)
    {
    	Liste p=NULL;
    	Liste q=NULL;
     
    	if (estVide(*l)==vrai)
    	{
    		p= (Liste) malloc(sizeof(Element));
    		p->c=c;
    		p->morse=malloc(strlen(m));
    		strcpy(p->morse,m);
    		p->suiv=NULL;
    		*l=p;
    	}
    	else
    	{
    		for(p=*l;p->suiv;p=p->suiv)
    		;
     
    		q= (Liste) malloc(sizeof(Element));
    		q->c=c;
    		q->morse=malloc(strlen(m));
    		strcpy(q->morse,m);
    		q->suiv=NULL;
    		p->suiv=q;
    	}
    }
     
    void Afficher_liste(Liste l)
    {
    	while(l!=NULL)
    	{
    		printf("Element : %c  %s\n",l->c,l->morse);
    		l=l->suiv;
    	}
    }
     
    main()
       {
           FILE *fp;
           char c;
          char ligne[100];
     
          char car;
           int j;
           char *code;
     
     
          Liste l=NULL;
     
     
          fp=fopen(FICHIER,"r");
           if(fp==NULL) printf("Fichier existe pas\n");
           else
           {
     
               c=fscanf(fp,"%c %s\n",&car,ligne);
               while(c!=EOF)
               {
                   j=strlen(ligne)+1;
                   code=(char*) malloc(sizeof(char)*j);
                   strcpy(code, ligne);
     
                   /***Travaille sur liste ****/
                   Ajouter_en_Fin(car,code,&l);
                   /***************************/
     
                c=fscanf(fp,"%c %s\n",&car,ligne);
               }
     	fclose(fp);
    	}
     
    	Afficher_liste(l);
     }
    J'aimerais savoir est ce que je doi comme meme rajouter + 1 à cette ligne

    q->morse=malloc(strlen(m));

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    OUI, indispensable
    sinon plante le jour où tu présenteras ton projet au prof : loi de l'emmerdement maximum, ou de la tartine de beurre, je ne sais plus
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Je compren il faut a chaque fois le rajouter afin de permettre l'ajout de '\0'
    Je te remercie pour ton aide.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    et pour en pas être embêté, toujours faire un memset après avoir alloué un char

  17. #17
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il peut effectivement être plus prudent d'initialiser la zone à 0, mais ce n'est pas obligatoire.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trap D
    OUI, indispensable
    sinon plante le jour où tu présenteras ton projet au prof : loi de l'emmerdement maximum, ou de la tartine de beurre, je ne sais plus
    http://www.courtois.cc/murphy/murphy_original.html

Discussions similaires

  1. problème de pointeur
    Par BnY dans le forum C
    Réponses: 61
    Dernier message: 07/05/2006, 12h31
  2. probleme de pointeur ....
    Par berg dans le forum C
    Réponses: 6
    Dernier message: 12/01/2006, 22h46
  3. Probleme de pointeurs
    Par mickyoun dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2004, 17h15
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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