Problème d'encodage de liste chainée

Problème d'encodage de liste chainée - C - Programmation

Marsh Posté le 06-05-2017 à 15:28:18    

Voilà mon problème : je dois créer une liste chainée pour contenir des articles (sur une facture). Je pense avoir fait les bonnes fonctions mais mon encodage rencontre des problèmes : lorsque j'encode (dans la fonction EncoderArticle) c'est bien encodé correctement (le printf me renvoie le bon string) mais quand je l'affiche juste après ma fonction le printf renvoie quelque chose comme ça : (Gx (et x change régulièrement). Si quelqu'un a une idée pour régler leproblème, je vous en serais reconnaissante.
 

Code :
  1. void EncoderArticle(article Produit)
  2. {
  3.   char nom[51];
  4.   printf ("\nVeuillez entrer le nom de l'article : " );
  5.   fflush(stdin);
  6.   scanf("%s", nom);
  7.   printf("%s", nom);
  8.   system("pause" );
  9.   Produit.Designation = (char*) malloc (sizeof(nom)+1);
  10.   strcpy(&(*Produit.Designation),nom);
  11.   printf ("\nVeuillez entrer le prix hors TVA de l'article : " );
  12.   fflush(stdin);
  13.   scanf ("%f", &(Produit.PrixHTVA));
  14.   printf ("\nVeuillez entrer la quantite desiree : " );
  15.   fflush(stdin);
  16.   scanf ("%d", &(Produit.Quantite));
  17.   printf("encodage : %s\n", Produit.Designation);
  18.   system("pause" );
  19. }
  20. void InsererElementListe(liste **ListeProduits)
  21. {
  22.   int trouve = 1;
  23.   int i = 1;
  24.   liste *parcours = NULL;
  25.   liste *inserer = NULL;
  26.   liste *precedent = NULL;
  27.   parcours = *ListeProduits;
  28.   inserer = (liste*) malloc(sizeof(liste));
  29.   EncoderArticle(inserer->Donnees);
  30.   printf("parcours %s\n", (parcours->Donnees).Designation);
  31.   system("pause" );
  32.   printf("Encoder OK\n" );
  33.   printf("inserer : %s\n", (inserer->Donnees).Designation);
  34.   system("pause" );
  35.   do
  36.   {
  37.       printf("condition boucle OK\n" );
  38.       printf("%s, %s, %d\n", ((inserer->Donnees).Designation), ((parcours->Donnees).Designation), i++);
  39.       system("pause" );
  40.     if (ComparerProduit(((inserer->Donnees).Designation), ((parcours->Donnees).Designation)) < 0)
  41.         {printf("Comparer OK" );
  42.         system("pause" );
  43.       trouve = 0;}
  44.     else
  45.     {
  46.         printf("else" );
  47.       precedent = parcours;
  48.       parcours = parcours->Suite;
  49.     }
  50.   }
  51.   while(parcours != NULL && !trouve);
  52.   inserer->Suite = parcours;
  53.   printf("inserer OK" );
  54.   system("pause" );
  55.   if (precedent == NULL)
  56.     *ListeProduits = inserer;
  57.   else
  58.     precedent->Suite = inserer;
  59. }


 
P.S.: les printf me servent pour le debug...

Reply

Marsh Posté le 06-05-2017 à 15:28:18   

Reply

Marsh Posté le 06-05-2017 à 16:17:33    

Un rapide coup d’œil me dit qu'il faut passer ton paramètre par adresse dans ta fonction EncoderArticle

Reply

Marsh Posté le 06-05-2017 à 16:30:18    

+1 pour Totoche17.
 
Pour la prochaine fois: Il est préférable de donner un code compilable, c'est à dire avec la définition/déclaration (je confonds toujours :o ) de "liste", les #include qui vont bien (même si dans ce cas présent c'est pas bien difficile de deviner ce qu'il faut) et le code pour ComparerProduit() et une main() réduit au max.
 
Surtout pour ce genre de bricolages avec des pointeurs il est très utile d'activer les warnings sur son compilateur (ce qui de toute façon devrait toujours être le cas!!), tu l'as fait? (GCC: rajouter -Wall comme paramètre en ligne de commande et -Werror si souhaité)
 
Quelque remarques:
-Tu ne vérifies pas ce que retourne malloc() (!=NULL).
-strcpy() est une fonction non sécurisée contre les buffer overflow, utiliser strncpy()!
-fflush(stdin); a un comportement indéfini selon le standard C (mais beaucoup de personnes l'utilisent et souvent ça fonctionne...).
-Il n'y a pas besoin de cast pour la valeur retournée par malloc(), sauf si par erreur tu compiles ton code avec un compilateur C++.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed