Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de pointeur

    18 mai 2018 à 18:13:01

    Bonjour, je suis entrain de programmer un dictionnaire de mot français->anglais mais j'ai un blocage, en effet, lorsque je décide d'afficher les éléments de mon dictionnaire, il affiche uniquement le dernier mot et sa traduction sans passer par les autres et ça fait au moins 1H que je bloque la dessus alors je viens demander votre aide et votre expertise pour éclairer ma lumière (et sans doute mon cerveau X) ).

    Voici le code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define LG 50
    
    struct vocable
    {
     char Lang1[LG];
     char Lang2[LG];
     struct vocable *pSuivantLang1;
     struct vocable *pSuivantLang2;
    };
    
    struct vocable *Nouveau;
    struct vocable *pCourant;
    struct vocable* pTeteLang1=NULL;
    struct vocable* pTeteLang2=NULL;
    
    
    void LireDico(FILE *fptr);
    void AfficherFrancaisAnglais();
    
    
    int main()
    {
        FILE *fptr;
        char filename[]="Dictionnaire.txt";
        system("cls");
        if ((fptr = fopen(filename,"r"))==NULL)
        {
            printf("Ouverture de %s impossible \n",filename);
        }
        else
        {
            LireDico(fptr);
            char Action;
            printf("Selectionnez une action en entrant la lettre affectee \n");
            printf("a. Afficher tout le dictionnaire Francais - Anglais \n");
            printf("b. Afficher tout le dictionnaire Anglais - Francais \n");
            printf("c. Chercher la traduction d'un mot Francais en Anglais \n");
            printf("d. Chercher la traduction d'un mot Anglais en Francais \n");
            printf("e. Inserer un nouveau mot dans le dictionnaire \n");
            printf("f. Enregistrer le dictionnaire \n");
            printf("Appuyez sur n'importe quelle lettre pour quitter le programme \n");
            scanf("%c",&Action);
            scanf("%c",&Action);
            while (Action == 'a' || Action == 'b' || Action == 'c' || Action == 'd' || Action == 'e' || Action == 'f')
            {
                if (Action == 'a')
                {
                    AfficherFrancaisAnglais();
                    scanf("%c",&Action);
                }
                else if (Action == 'b')
                {
                    AfficherAnglaisFrancais();
                }
                else if (Action == 'c')
                {
                    //ChercherFrancaisAnglais();
                }
                else if (Action == 'd')
                {
                   //ChercherAnglaisFrancais();
                }
                else if (Action == 'e')
                {
                    //InsererMot();
                }
                else if (Action == 'f')
                {
                    //EnregistrerDictionnaire();
                }
                printf("Selectionnez une action en entrant la lettre affectee \n");
                printf("a. Afficher tout le dictionnaire Francais - Anglais \n");
                printf("b. Afficher tout le dictionnaire Anglais - Francais \n");
                printf("c. Chercher la traduction d'un mot Francais en Anglais \n");
                printf("d. Chercher la traduction d'un mot Anglais en Francais \n");
                printf("e. Inserer un nouveau mot dans le dictionnaire \n");
                printf("f. Enregistrer le dictionnaire \n");
                printf("Appuyez sur n'importe quelle lettre pour quitter le programme \n");
                scanf("%c",&Action);
                scanf("%c",&Action);
                scanf("%c",&Action);
            }
        }
        return 0;
    }
    
    void LireDico(FILE *fin)
    {
        Nouveau = malloc(sizeof(struct vocable));
        while((fscanf(fin, "%s %s", Nouveau->Lang1, Nouveau->Lang2))!= EOF)
        {
        }
    
        pTeteLang1=Nouveau;
        pTeteLang2=Nouveau;
    }
    
    void AfficherFrancaisAnglais()
    {
        printf("FRANCAIS:           ANGLAIS: \n");
        pCourant=pTeteLang1;
        while (pCourant != NULL)
        {
            printf("%s              %s \n",pCourant->Lang1,pCourant->Lang2);
            pCourant=pCourant->pSuivantLang1;
        }
    }
    
    void AfficherAnglaisFrancais()
    {
        printf("ANGLAIS:           FRANCAIS: \n");
        pCourant=pTeteLang2;
        while (pCourant != NULL)
        {
            printf("%s              %s \n",pCourant->Lang2,pCourant->Lang1);
            pCourant=pCourant->pSuivantLang2;
        }
    }



    -
    Edité par TerryHaendle 18 mai 2018 à 18:14:20

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      18 mai 2018 à 18:34:00

      Bonsoir,

      Peux-tu donner un exemple de la forme du fichier dictionnaire.txt ?

      Sur le principe ta problématique est d'analyser une ligne de ton fichier, et de le faire pour chaque ligne par la suite avec une boucle.

      Peux-tu expliquer les différentes structures en début de programme ? L'objectif de ton travail ne serait pas d'utiliser les listes chaînées ? Si c'est le cas, est-ce obligatoire ?

      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2018 à 18:40:37

        Pour l'exemple: j'ai le mot en français et la ligne en dessous sa traduction et ainsi de suite

        Pour la structure, char Lang1 stock les mots en français et char Lang2 stock les mots en anglais (qui se trouvent dans le fichier)

        Oui, les listes chaînées sont obligatoires

        struct vocable *pSuivantLang1;
        struct vocable *pSuivantLang2;

        Pour ces deux variables de la structure, je suppose qu'elles servent à passer à chaque fois au pointeur suivant dans la structure lors de l'affichage

        struct vocable *pCourant;
        struct vocable* pTeteLang1=NULL;
        struct vocable* pTeteLang2=NULL;

        pCourant sert, lors de l'affichage, à afficher les données en fonction du pointeur qui lui est attribué

        pTeteLang1 et 2 s'occupe de revenir au départ de la liste lorsque on les appels (J'utilise pTeteLang1 lorsque j'affiche le dictionnaire dans le sens français->anglais et pTeteLang2 dans le sens inverse

        (On vient de commencer cette partie de notre cours à l'école, c'est peut être pour ça que je galère et on doit faire ce dictionnaire pour notre examen mais c'est vraiment difficile)

        -
        Edité par TerryHaendle 18 mai 2018 à 18:46:02

        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2018 à 18:55:48

          Hello,

          Avant de créer tes listes chaînées, il faudrait commencer par remplir convenablement une structure vocable, et donc lire convenablement une peut-être deux lignes dans ton fichier - ce que tu expliques et ce que tu as écrit étant incompatible.

          -
          Edité par edgarjacobs 18 mai 2018 à 19:00:15

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            18 mai 2018 à 19:05:26

            En soit, je sais comment afficher la liste en la stockant dans ma structure en faisant de cette manière: 

            https://i.gyazo.com/298193043a788c00b4d5734f93fa4bda.png 

            (Petit problème d'affichage, je corrigerai ça par la suite quand j'aurai fait tout fonctionner correctement)

            Ce qu'il y a, c'est que je ne sais pas si du coup, ça reste des listes chaînées ou non vu que je me contente juste de lire ce qu'il y a dans mon fichier et puis c'est tout (ce qui me parait beaucoup trop facile de faire ainsi et je sent que ça va poser problèmes par la suite de faire comme ça)

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              18 mai 2018 à 19:34:10

              Sur ce forum, tu trouveras un cours sur les listes chaînées, je t'invite à le lire et modifier tes structures selon ta problématique.

              • Partager sur Facebook
              • Partager sur Twitter
                18 mai 2018 à 19:38:43

                D'accord je vais jeter un coup d'oeil, merci ^^

                EDIT: Bon juste par curiosité (j'ai pas encore lu le cours), j'ai vérifié avant d'aller manger quelles valeurs ont mes pointeurs et voici ce que j'ai:

                https://i.gyazo.com/1b463fddc5d1689fdb415522c5a6c056.png

                Du coup, je me demande si depuis le début, la valeur attribuée a un pointeur n'est pas a chaque fois éliminée

                -
                Edité par TerryHaendle 18 mai 2018 à 20:57:47

                • Partager sur Facebook
                • Partager sur Twitter
                  19 mai 2018 à 14:52:20

                  Salut, je ne suis pas sur a 100 % mais dans lire dico, ton while (fscanf...) vas stocker dans Nouveau->Lang1 Nouveau->Lang2

                  Premier tour de boucle : Nouveau>Lang1 Nouveau->Lang2 est équivalent à la ligne1

                  Second tour de boucle : Nouveau>Lang1 Nouveau->Lang2 est équivalent à la ligne2

                  etc ...

                  Dernière tour de boucle : Nouveau->Lang1 Nouveau->Lang2 est équivalent à la dernière ligne

                  Tu sors de la boucle :pTeteLang1=Nouveau;pTeteLang2=Nouveau;

                  Donc pTeteLang1 est égal à pTeteLang2 qui sont équivalent à la dernière ligne.

                  J'en ai pas regarder plus mais lorsque tu lis ton fichier avec le while tu dois stocker à chaque étapes en jouant avec tes liste chaînées

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mai 2018 à 19:40:48

                    C'est bon, j'ai réussi à résoudre mon problème en faisant de cette manière (et du coup, faire quasi tout ce que mon prof me demandait par la suite)
                    void LireDico(FILE *fin)
                    {
                        Nouveau = malloc(sizeof(struct vocable));
                        while((fscanf(fin, "%s %s", Nouveau->Lang1, Nouveau->Lang2))!= EOF)
                        {
                            Nouveau->pSuivantLang1=pTeteLang1;
                            Nouveau->pSuivantLang2=pTeteLang2;
                            pTeteLang1=Nouveau;
                            pTeteLang2=Nouveau;
                            Nouveau = malloc(sizeof(struct vocable));
                        }
                    }
                    Maintenant, je suis face a un dernier soucis (la toute dernière étape avant de pouvoir envoyer tout ça a mon prof hehehe), c'est de classer mes mots par ordre alphabétique et la par contre... Je suis un peu dans la merde on va dire en sachant que je ne vois absolument pas comment faire ça avec... Des pointeurs X)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      19 mai 2018 à 19:51:04

                      TerryHaendle a écrit:

                      Pour l'exemple: j'ai le mot en français et la ligne en dessous sa traduction et ainsi de suite

                      Ce n'est donc pas la forme du fichier spécifié au départ...

                      -
                      Edité par Anonyme 19 mai 2018 à 19:51:29

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mai 2018 à 19:56:34

                        oldProgrammer a écrit:

                        TerryHaendle a écrit:

                        Pour l'exemple: j'ai le mot en français et la ligne en dessous sa traduction et ainsi de suite

                        Ce n'est donc pas la forme du fichier spécifié au départ...

                        -
                        Edité par oldProgrammer il y a 3 minutes


                        Oups... Enfin bon, j'ai quand même réussi à trouver comment résoudre mon souci et à pouvoir faire tranquillement mon code, me reste plus qu'a tenter de comprendre ce que je dois faire maintenant ^^

                        EDIT: Merci pour le lien d'ailleurs, ça m'a vachement aidé ^^

                        -
                        Edité par TerryHaendle 19 mai 2018 à 20:13:26

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mai 2018 à 20:13:52

                          Il y a 2 fonctions à faire, l'une qui compare si un mot est avant un autre,

                          L'autre qui permet d'insérer un élément dans une liste chaînée

                          Tu peux créer une nouvelle liste chaînée qui vaut null.

                          Une fonction récursive qui pour chaque mots va : l'insérer si la liste est null

                                                                                                  Sinon si le mot est après ( ordre alphabétique ) tu appel récursivement la fonction avec l'élément suivant de ta liste

                                                                                                           si est avant, tu l'insère.

                          T'es pas obligé de faire comme ça mais une fonction pour insérer un élément dans une liste et une fonction pour comparer si un mot est avant ou après un autre sont essentiels. Bonne chance

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 mai 2018 à 20:15:15

                            Golgoo a écrit:

                            Il y a 2 fonctions à faire, l'une qui compare si un mot est avant un autre,

                            L'autre qui permet d'insérer un élément dans une liste chaînée

                            Tu peux créer une nouvelle liste chaînée qui vaut null.

                            Une fonction récursive qui pour chaque mots va : l'insérer si la liste est null

                                                                                                    Sinon si le mot est après ( ordre alphabétique ) tu appel récursivement la fonction avec l'élément suivant de ta liste

                                                                                                             si est avant, tu l'insère.

                            T'es pas obligé de faire comme ça mais une fonction pour insérer un élément dans une liste et une fonction pour comparer si un mot est avant ou après un autre sont essentiels. Bonne chance

                            Je veux bien mais le problème est que mon prof veut que je travail sur une seule liste chainée

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 mai 2018 à 20:33:49

                              Ok alors une liste unique de mot devrait faire :

                              chat -> serpent -> renard -> abeille -> NULL

                              C'est très loin d'être une solutions très optimale, mais elle marche :

                              L'idée c'est de juste changer la direction des flèche,

                               "chat" avant "serpent" tu fais rien

                               "chat" avant "renard" tu fais rien

                              "chat" pas avant "abeille" alors abeille -> NULL deviendra abeille -> chat

                                                                           et renard -> abeille deviendra renard -> NULL

                              et la fonction renvoie faux ( <=> la liste n'est pas encore triée )

                              Donc tu l'as rappelle : elle donne maintenant :

                              abeille -> chat -> serpent -> renard -> NULL

                              "abeille" avant "chat" touche rien

                              "abeille" avant "serpent" touche rien

                              "abeille" avant "renard" touche rien

                              "abeiile" avant NULL Ok on passe au mot suivant avant de regarder ce qu'il y a dans NULL

                              "chat" avant "serpent" touche rien

                              "chat" avant "renard" touche rien

                              chat .. NULL

                              "serpent" pas avant "renard" : Idem renard -> NULL devient renard->serpent

                                                                           et serpent -> renard devient serpent->NULL ( l'élément ou pointe renard avant )

                              fonction renvoie faux ( <=> pas encore triée )

                              tu rappelle donc la fonction, on a :

                              abeille -> chat -> renard -> serpent -> NULL

                              "abeille" avant ..

                              ..

                              ..

                              "renard" avant "serpent" touche rien

                              "serpent" .. NULL

                              NULL, c'est bon c'est trié on renvoie vrai

                              Et on ne rappelle pas cette fonction.

                              Je trouve que c'est un exemple un peu long pour un simple trie mais il marche, tu peux toujours regarder le cours sur les liste chaîné ou quelques algo de tri pour le faire mieux si tu veux

                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 mai 2018 à 22:12:47

                                Hello,

                                Il est un peu (beaucoup) ridicule de trier une liste chainée APRÈS avoir lu et chaîné tous ses maillons. Il faut trier la liste lors de la création, donc: je lis un mot et je l'insère au bon endroit, ce qui implique de savoir insérer un élément au début, au milieu et en fin de liste. Et pour faire cela (l'insertion), une fonction suffit.

                                -
                                Edité par edgarjacobs 19 mai 2018 à 22:13:31

                                • Partager sur Facebook
                                • Partager sur Twitter

                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                  19 mai 2018 à 22:46:31

                                  edgarjacobs a écrit:

                                  Hello,

                                  Il est un peu (beaucoup) ridicule de trier une liste chainée APRÈS avoir lu et chaîné tous ses maillons. Il faut trier la liste lors de la création, donc: je lis un mot et je l'insère au bon endroit, ce qui implique de savoir insérer un élément au début, au milieu et en fin de liste. Et pour faire cela (l'insertion), une fonction suffit.

                                  -
                                  Edité par edgarjacobs il y a 28 minutes

                                  Le faire directement ans ma fonction LireDico alors ?



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 mai 2018 à 23:00:11

                                    Comme dis edgar tu peux directement trier lorsque tu créer ta liste chaînée sinon à partir d'une liste chaînée non triée tu peux :

                                    en créer une deuxième et la remplir en la triant,

                                    ou bien : la triée directement sans créer de deuxième listes :

                                    Pour trier

                                    [1]->[3]->[4]->[2]->[5]

                                    Tu compare les valeurs 2 à deux.

                                    1 < 3 on touche pas etc ....

                                    4 < 2 faux donc tu change la place de 2 et 4
                                    ça devrait donner un truc comme ça  : [1]->[3]->[2]->[4]->[5]
                                    tu recommence : 1 < 3 ; 3 < 2 faux tu change 2 et 3 ;

                                    tu recommence 1 < 2 ; 2 < 3; 3 < 4 ; 4 < 5 rien a modifier alors c'est triés.

                                    -
                                    Edité par Golgoo 19 mai 2018 à 23:01:36

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 mai 2018 à 23:06:38

                                      TerryHaendle a écrit:

                                      edgarjacobs a écrit:

                                      Hello,

                                      Il est un peu (beaucoup) ridicule de trier une liste chainée APRÈS avoir lu et chaîné tous ses maillons. Il faut trier la liste lors de la création, donc: je lis un mot et je l'insère au bon endroit, ce qui implique de savoir insérer un élément au début, au milieu et en fin de liste. Et pour faire cela (l'insertion), une fonction suffit.

                                      -
                                      Edité par edgarjacobs il y a 28 minutes

                                      Le faire directement ans ma fonction LireDico alors ?




                                      Oui.

                                      Enfin, pas vraiment: tu lis dans LireDico, qui appelle une fonction d'insertion à la place des lignes 6 à 9, qui elles, insèrent toujours en tête de liste.

                                      Et je viens de parcourir ta fonction LireDico(). Tu fais une allocation de trop. Déplace la ligne 10 après la 5, et supprime la 3.

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                        19 mai 2018 à 23:34:16

                                        Bon, je comprends vraiment pas comment faire ce fichu tri xD je pense que je vais créer un nouveau topic pour avoir + de visibilité sur le sujet et peut être d'autre explications (ou des exemples pour mieux voir le fonctionnement)
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Problème de pointeur

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown