[C/C++] Liste chainée et chaine de caractére

Liste chainée et chaine de caractére [C/C++] - C - Programmation

Marsh Posté le 28-02-2007 à 12:59:49    

Salut à tous
 
voila mon probleme, je defini une structure de liste chainée de produit donc qui comporte 4 valeurs: prix,code,quantitee et un nom.
c'est l'affectation de ces valeurs qui me posent pb.
Pour le prix/code/quantitée pas de probleme ; ce sont des entiers.
Mais pour le nom que je rentre comme chaine de caractere, le compilateur veut pas.
"ISO C++ forbids assignment of arrays"
 
à terme l'affectation doit etre automatique avec la lecture d'un fichier
 

Code :
  1. /*Definition de la structure produit*/
  2. struct cel_produit
  3. {int code;
  4. char nom[10];
  5. int quantitee;
  6. int prix;
  7. struct cel_produit *suivant;
  8. };
  9. void remplir_stock_fichier (struct cel_produit *liste,char *fichier)
  10. {
  11.     FILE *stock;
  12.     stock=fopen(fichier,"r" );
  13.     if (stock==NULL)
  14.        printf("Fichier inexistant\n" );
  15.     struct cel_produit *liste2;
  16.     liste2=NULL;
  17.     while (!feof(stock))
  18.     {
  19.           liste=(struct cel_produit *)(malloc(sizeof(struct cel_produit)));
  20.           fscanf(stock,"%d",&(*liste).code);
  21.           fseek(stock,10L,SEEK_CUR);
  22.           fgets((*liste).nom,7,stock);
  23. /*          fscanf(stock,"%d",&(*liste).quantitee);*/
  24.           fscanf(stock,"%d",&(*liste).prix);
  25.           liste->suivant=liste2;
  26.           liste2=liste;
  27.     }
  28. }
  29. /*affiche_tableau_stock recoit en argument un tableau de produit et un entier m et affiche les m premieres cases du tableau de produit*/
  30. void affiche_liste_stock (struct cel_produit *liste)
  31. {
  32.     /*struct cel_produit *liste2;*/
  33.     printf("on a en stock:\n" );
  34.     /*liste2=liste;*/
  35.     do
  36.         {
  37.          printf("%d bouteilles de \navec comme code %d et prix %d\n\n",liste->quantitee,liste->code,liste->prix);
  38.          /*printf("%d bouteilles \n",(*liste).quantitee);*/
  39.          liste=liste->suivant;
  40.         }while (liste!=NULL);
  41. }
  42. /*fonction main, pas d'arguments*/
  43. main()
  44. {
  45.     struct cel_produit *listeprod;
  46.     listeprod=(struct cel_produit *)(malloc(sizeof(struct cel_produit)));
  47.     listeprod->code=1;
  48.     listeprod->quantitee=2;
  49.     listeprod->nom="ensearien";
  50.     listeprod->prix=3;
  51.     listeprod->suivant=NULL;
  52. /*    remplir_stock_fichier(listeprod,"stock.txt" );*/
  53.     affiche_liste_stock(listeprod);
  54. }


 
 
Merci à tous ceux qui prendront le temps de m'aider

Reply

Marsh Posté le 28-02-2007 à 12:59:49   

Reply

Marsh Posté le 28-02-2007 à 13:53:11    

up :bounce:

Reply

Marsh Posté le 28-02-2007 à 14:06:03    

Tout simplement parce qu'on assigne pas une chaine de caractère comme ça en C (ton code est écrit en C et non en C++, d'ailleurs, même en C++ ça ne marcherait pas)
 
- char nom[10];
+ char *nom;
 
- fgets((*liste).nom,7,stock);
+ liste->nom = malloc(8*sizeof(char))
+ fgets(liste->nom,7,stock);
 
- listeprod->nom="ensearien";
+ listeprod->nom=strdup("ensearien" );

Reply

Marsh Posté le 28-02-2007 à 14:20:51    

merci
juste une precision
le compilateur ne reconnait pas la fonction "strdup"
faut-il ajouter une bibliotheque speciale?
et que fait cette fondtion, je la connais pas?

Reply

Marsh Posté le 28-02-2007 à 14:21:30    

man :o
google :o


---------------
Töp of the plöp
Reply

Marsh Posté le 28-02-2007 à 14:24:06    

std::string; std::list ....

Reply

Marsh Posté le 28-02-2007 à 14:25:32    

theshockwave a écrit :

std::string; std::list ....


en fait on est en C finalement :o


---------------
Töp of the plöp
Reply

Marsh Posté le 28-02-2007 à 14:26:41    

_darkalt3_ a écrit :

en fait on est en C finalement :o


 
dans ce cas, il va falloir aussi compiler en C ...
 

frodon131 a écrit :

Mais pour le nom que je rentre comme chaine de caractere, le compilateur veut pas.
"ISO C++ forbids assignment of arrays"


 

Reply

Marsh Posté le 28-02-2007 à 14:33:35    

theshockwave a écrit :

dans ce cas, il va falloir aussi compiler en C ...


 
je sais pas trop la difference mais j'utilise dev c++ chez moi sur windows et mes fichiers sont en .c à mon école

Reply

Marsh Posté le 28-02-2007 à 14:35:24    

La fonction strdup c'est bon j'ai reussi à la faire marcher et l'affichage est correct pour les données que je rentre une par une mais maintenant c'est lors de l'affichage de la liste genéré par la lecture du fichier que ca plante

Reply

Marsh Posté le 28-02-2007 à 14:35:24   

Reply

Marsh Posté le 28-02-2007 à 14:56:47    

Je crois que tu la construis mal ta liste
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct cel_produit *remplir_stock_fichier (char *fichier){
  4.          struct cel_produit *liste = NULL;
  5.          while (!feof(stock)){
  6.                   // Ajout en tête de liste
  7.                   struct cel_produit *liste2 = malloc(sizeof(struct cel_produit)); // c'est pas bien de caster les malloc
  8.                   liste2->suivant = liste;
  9.                   liste = liste2;
  10.        
  11.                   // ici, tu remplie tes données
  12.                   /* ........... */
  13.          }
  14.          return liste;
  15. }
  16. void lire_liste(struct cel_produit *liste){
  17.      if(liste != null){
  18.             // mettre les printf ici pour une lecture depuis le début de la liste
  19.             lire_liste(liste->suivant);
  20.             // mettre les printf ici pour une lecture depuis la fin de la liste
  21.      }
  22. }
  23. int main(int argc, char **argv){
  24.      struct cel_produit *liste = remplir_stock_fichier ("/home/toto/fichier" );
  25.      lire_liste(liste);
  26.      return EXIT_SUCCESS;
  27. }


Message édité par Dumbledore le 28-02-2007 à 14:57:43
Reply

Sujets relatifs:

Leave a Replay

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