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 char* et liste chainée


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Points : 43
    Points
    43
    Par défaut probleme char* et liste chainée
    Bonjour dans le cadre d'un projet j'ai un programme de traduction de morse à faire en C.

    Je recupere à partir d'un fichier texte, le code morse correspondant à chaque lettre.

    Ce code est dans un char*. Je dois ensuite remplir une liste chainée (obligatoirement) contenant ce meme code et la lettre correspondant.


    j'ai donc une liste:

    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
     
    #ifndef liste_h
    #define liste_h
    #include<stdio.h>
    #include<stdlib.h>
     
     
    struct elem {     char alpha;
                      char *morse;
                      struct elem* suiv;
                  };
     
    typedef struct elem element;
    typedef struct elem* liste;
     
     
    #endif
    Les fonctions pour connaitre les valeurs de la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char alphaValeur(liste l)
    {
    return l->alpha;
    }
    char morseValeur(liste l)
    {
    return l->morse;
    }
    Celle pour construire ma liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    liste cons(char a,char *m,liste l)
    {
     
    liste p;
    p=(liste)malloc(sizeof(element));
    p->alpha=a;
    //strcpy(p->morse,m);
    p->morse=*m;
    p->suiv=l;
    return p;
    }
    Et celle pour l'afficher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void afficheliste(liste l) 
    {
    liste p=l;
    while(p)
    {
    printf("(%c,%c) ",alphaValeur(p),morseValeur(p));
    p=reste(p);
    }
    printf("\n");
    }
    Voila le souci c'est que je n'ai pas le code morse complet, seulement la premiere lettre.
    J'ai deja essayé de mettre un "%s" dans la fonction d'affichage mais le programme plante, une "*" dans la fonction qui me retourne le code morse mais le programme plante.

    Je ne trouve pas de solutions si vous pouviez me donner un coup de pouce ça serait plutot cool.

    Voici au passage ma procedure qui lit mon fichier texte:

    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
     
     
    void essai2()
    {
         FILE* fichier = NULL;
        fichier = fopen("txtMorse.txt", "r");
        char alpha;
        char *morse=NULL;
        char chaine[TAILLE_MAX] = "";
        liste l=NULL;
        int index;
     
     
        if (fichier != NULL)
        {
            while (fgets(chaine, TAILLE_MAX, fichier)!= NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                alpha=chaine[0];
                printf("%c",alpha); 
                morse=strpbrk(chaine,".-");
                printf("%s\n",morse);
                l=cons(alpha,morse,l);
     
            }
        }
         fclose(fichier); // On ferme le fichier qui a été ouvert 
     
         afficheliste(l);       
    }
    Merci d'avance.

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct elem {     char alpha;
                      char *morse;
                      struct elem* suiv;
                  };
    Tu as un simple char *morse.
    Tu ne fais que copier un pointeur ici. Tu ne recopies pas chaque caractère de la chaîne.
    Tu as enlevé le strcpy, tu aurais du le laisser ! MAIS, il faut auparavant que dans ta chaîne il y ait la place nécessaire. Deux solutions : tu alloues l'espace dynamiquement. Ou, plus simples, tu changes un peu ta structure en

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Points : 43
    Points
    43
    Par défaut
    Merci de ta réponse qui a été rapide je test ça demain, en fait juste avant mon strcpy il faut que je fasse un malloc?

    Et ma fonction qui me retourne le char* de ma liste reste en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char morseValeur(liste l)
    {
    return l->morse;
    }
    ou passe en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *morseValeur(liste l)
    {
    return l->morse;
    }

  4. #4
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Si tu choisis cette solution, tu n'auras pas besoin de faire de malloc. La mémoire est DEJA présente quand tu crées la structure. Du moment que tu n'essaies pas de copier plus de caractères que MAX_CHR , tu n'auras pas de problème.

    En effet, je navais pas fait attention à ça, mais cest bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *morseValeur(liste l)
    {
    return l->morse;
    }
    car tu retournes un pointeur vers un caractère.
    Mais après faire une fonction pour ça, cest pas forcément très intéressant. Une macro à la limite, mais ca reste sans grand intérêt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define morseValeur(l) ( (*(l)).morse)

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Points : 43
    Points
    43
    Par défaut
    Merci pour l'astuce du #define, c'est simplement notre prof qui nous a montrer par le biais d'une fonction.

    Le probleme c'est que le nombre de caracteres morse est variable donc je ne vais pas allouer un tab de taille fixe.

    Je test tout ça j'espere que ça va fonctionner.

    Merci encore de ton aide.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Points : 43
    Points
    43
    Par défaut
    Ca marche nikel j'ai juste eu un ptit soucis car dans mon fichier texte j'ai un saut de ligne à la fin de mes caracteres en morse.

    Je l'ai réglé avec un:

    if(morse[strlen(morse)-1]=='\n')
    morse[strlen(morse)-1]='\0';

    Car avec un strncpy(morse2,morse,strlen(morse)-1) j'avais des caracteres farfelus qui apparaissaient pour certaines lettres.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Points : 43
    Points
    43
    Par défaut
    Je pensais en avoir fini et bien non pourtant je suis au bout du bout mais j'ai une erreur que je ne trouve pas.

    je lis un fichier de morse pour le traduire.

    Apres avoir construit ma liste contenant mon code morse et les lettres, j'ai fais une fonction qui me retourne la lettre correspondant au code morse passé en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char retourneAlpha(liste l,char *m)
    {
    liste p=l;
    while(morseValeur(p)!=m)
    {
    p=reste(p);
    }
    return alphaValeur(p);
    }

    Elle fonctionne car ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%c\n",retourneAlpha(l,morseValeur(l)));
    me retourne la premiere lettre de ma liste. morseValeur(l) est un char*


    En revanche quand je lis un fichier morse et que je fais ç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
     
    void lireFichierMorse(liste l)
    {
        FILE* fichier = NULL;
        fichier = fopen("morse.txt", "r");
        char chaine[TAILLE_MAX] = "";
        char chaine2[5] = "";
        int index=0;
        int index2=0;
        char *morse=NULL;
     
     
        if (fichier != NULL)
        {
            while (fgets(chaine, TAILLE_MAX, fichier)!= NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                  while(chaine[index]!='\n')
                  {
                          if(chaine[index]!=' ')
                          {
                                  chaine2[index2]=chaine[index];
                                  index2++;
                          } 
                          else 
                          {
                              morse=strpbrk(chaine2,".-");
                              printf("%s",morse);
                              printf("%c",retourneAlpha(l,morse)); // ça plante ici pourtant morse est un char* ne contient rien d'autre que du morse
                              index2=0;
                              while(index2<5){chaine2[index2]='\0';index2++;}
                              index2=0;
     
                          }
                          index++;
     
                  }   
     
            }
            printf("\n"); 
        }
         fclose(fichier);     
    }
    A noter que l'inverse fonctionne parfaitement (lecture d'un fichier texte et traduction en morse.) Donc je ne comprend vraiment pas le probleme qui se pose ici.

    Merci à ceux qui m'aideront.

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char retourneAlpha(liste l,char *m)
    {
    liste p=l;
    while(morseValeur(p)!=m)
    L'expression dans le while ne compare pas les chaînes de caractères d'adresse morseValeur(p) et m, mais les adresses elles-même. Le résultat est donc en cas général toujours Vrai.
    Pour comparer des chaînes de caractères, utiliser la fonction strcmp.

    Elle fonctionne car ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c\n",retourneAlpha(l,morseValeur(l)));
    ...
    Voila un test très mal choisi :
    m est morseValeur(l) et la condition devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(morseValeur(l)!=morseValeur(l))
    cas très particulier qui donne Faux !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Points : 43
    Points
    43
    Par défaut
    Ouh pinaise le boulet... Bien vue... Merci beaucoup le projet est finie... Enfin j'espere...

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

Discussions similaires

  1. probleme avec une liste chainée
    Par simpatico dans le forum Débuter
    Réponses: 10
    Dernier message: 25/07/2011, 08h45
  2. Probleme avec une liste chainée
    Par apen2k2 dans le forum C
    Réponses: 7
    Dernier message: 14/12/2006, 16h31
  3. petit probleme avec une liste chainée
    Par kamouminator dans le forum C
    Réponses: 26
    Dernier message: 06/11/2006, 20h18
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. Réponses: 11
    Dernier message: 02/05/2005, 19h30

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