Affectation d'une valeur à un élément d'une liste chainée

Affectation d'une valeur à un élément d'une liste chainée - C - Programmation

Marsh Posté le 25-04-2005 à 17:15:49    

Bonjour, je suis en train d'écrire une fonction qui récupére des éléments stockés dans un fichier sous la forme :
 
0001|tutu|toto|0850505050|tutu@toto.com|001
0002|pupu|popo|0860606060|pupu@popo.com|001
 
Je cherche à insérer ces valeurs dans ma liste simplement chainée.
 
Voici  mon code :
 

Code :
  1. // déclarations
  2. typedef struct candidature {
  3.     chaine nom,prenom,mail,tel,numero, num_offre,num_secteur,
  4.     dt_anne_cand,dt_mois_cand;
  5.     struct candidature * suiv;
  6. }candidature;
  7. candidature *tete_cand = NULL;
  8. chaine nom_fichier;
  9. FILE * fichier;
  10. // fonction
  11. void load(){
  12.      chaine msg;
  13.      int i;
  14. // Chargement du fichier txt : save.txt
  15. // et affectation des valeurs dans les listes chainées
  16.     candidature *c;
  17.     c=(candidature*)malloc(sizeof(candidature));
  18. c = tete_cand;
  19. i = 1;
  20. // Ouverture du fichier en lecture
  21. fichier = fopen("save.txt", "r" );
  22. // Positionnnement du cursuer au début du fichier
  23. fseek( fichier, 0, SEEK_SET);
  24.     // Tant qu'on a pas fini de parcourir le fichier
  25. while( fgets( msg, sizeof(msg), fichier)!=NULL ) {
  26.            printf("%s", msg);
  27.            // TRAITEMENT DE LA CHAINE DE CARACTERES RENVOYEE
  28.                 char sep[] ="|";
  29.                 char *ptr;         
  30.                 ptr = strtok(msg, sep);
  31.                 while ( ptr != NULL ) {
  32.                   puts(ptr);
  33.                   ptr = strtok(NULL, sep);
  34.                   // AFFECTATION DE LA VALEUR DANS LA LISTE
  35.                      // On affecte à l'élément les valeur récupérées
  36.                     switch (i) {
  37.                             case 1 :        c->numero            = ptr;      break;
  38.                             case 2 :        c->nom               = ptr;      break;
  39.                             case 3 :        c->prenom            = ptr;      break;
  40.                             case 4 :        c->tel               = ptr;      break;
  41.                             case 5 :        c->mail              = ptr;      break;
  42.                             case 6 :        c->num_secteur       = ptr;      break;
  43.                      }
  44.                 // Ecriture de la liste (a faire)
  45.                 } 
  46.                 /////////////////////////////////////////
  47.                 i=1;                     
  48.             ////////////////////////////////////////////////
  49.     }
  50.     system("PAUSE" );
  51. }


 
Mon soucis est au niveau de l'affectation de ptr à un élément de la liste chainée : c->num_secteur       = ptr;
 
Erreur :
incompatible types in assignment  
 
Je ne sais pas comment affecter ptr à c->quelquechose. A chaque fois que j'ai eu à affecter des variables à un élément de ma liste, c'était après avoir récupéré cette variable avec un scanf.
Je suis sur que la soluce est conne, mais jvois po  :sweat:


---------------
Cptn.Barberousse
Reply

Marsh Posté le 25-04-2005 à 17:15:49   

Reply

Marsh Posté le 25-04-2005 à 17:17:29    

Je précise que mon puts(ptr) me renvoi bien la valeur désirée  :jap:


---------------
Cptn.Barberousse
Reply

Marsh Posté le 25-04-2005 à 18:22:44    

C'est quoi ce type "chaine" ?

Reply

Marsh Posté le 25-04-2005 à 18:23:38    

c'est quoi chaine ?  car ptr c'est du char * ... donc ça n'est pas la même chose.

Reply

Marsh Posté le 25-04-2005 à 19:08:07    

Sinan a écrit :

Je précise que mon puts(ptr) me renvoi bien la valeur désirée  :jap:


Peut-être mais vu que tu fais :

ptr = strtok(NULL, sep);


 
juste après, c'est plus la bonne valeur que tu stockes.
 
(bon après y a toujours le problème de ces "chaine" )


Message édité par Tarabiscote le 25-04-2005 à 19:08:39
Reply

Marsh Posté le 25-04-2005 à 19:22:50    

Mon chaine est un :
 
typedef char chaine[200];

Reply

Marsh Posté le 25-04-2005 à 19:33:23    

vi, mais là il faut que tu fasses une copie, pas une affectation avec ton type chaine, genre :
strcpy( c->nom, ptr);

Reply

Marsh Posté le 25-04-2005 à 20:08:10    

Sinan a écrit :

Voici  mon code :


Pour avoir la version qui compile, faut payer ?


main.c:15: parse error before "chaine"
 
main.c:15: warning: no semicolon at end of struct or union
main.c:18: parse error before '}' token
main.c:18: warning: type defaults to `int' in declaration of `candidature'
main.c:18: warning: data definition has no type or storage class
main.c:19: parse error before '*' token
main.c:19: warning: type defaults to `int' in declaration of `tete_cand'
main.c:19: `NULL' undeclared here (not in a function)
main.c:19: warning: data definition has no type or storage class
main.c:20: parse error before "nom_fichier"
main.c:20: warning: type defaults to `int' in declaration of `nom_fichier'
main.c:20: warning: data definition has no type or storage class
main.c:21: parse error before '*' token
main.c:21: warning: type defaults to `int' in declaration of `fichier'
main.c:21: warning: data definition has no type or storage class
main.c:23: warning: function declaration isn't a prototype
main.c: In function `load':
main.c:24: `chaine' undeclared (first use in this function)
main.c:24: (Each undeclared identifier is reported only once
main.c:24: for each function it appears in.)
main.c:24: parse error before "msg"
main.c:28: `c' undeclared (first use in this function)
main.c:29: parse error before ')' token
main.c:33: warning: implicit declaration of function `fopen'
main.c:33: warning: assignment makes pointer from integer without a cast
main.c:35: warning: implicit declaration of function `fseek'
main.c:35: `SEEK_SET' undeclared (first use in this function)
main.c:37: warning: implicit declaration of function `fgets'
main.c:37: `msg' undeclared (first use in this function)
main.c:37: `NULL' undeclared (first use in this function)
main.c:38: warning: implicit declaration of function `printf'
main.c:42: warning: implicit declaration of function `strtok'
main.c:42: warning: assignment makes pointer from integer without a cast
main.c:44: warning: implicit declaration of function `puts'
main.c:45: warning: assignment makes pointer from integer without a cast


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-04-2005 à 20:36:30    

Emmanuel Delahaye a écrit :

Pour avoir la version qui compile, faut payer ?


ma



 
 
 :hello:  
 
Question a moitié HS, tu compile avec quoi comme parametres ?
 
-Ansi -pedantic -Wall ?


---------------
.
Reply

Marsh Posté le 25-04-2005 à 20:46:44    

didier1809 a écrit :

:hello:  
 
Question a moitié HS, tu compile avec quoi comme parametres ?
 
-Ansi -pedantic -Wall ?


Un peu plus que ça!
 
-W -Wall -O2 -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wredundant-decls -Wnested-externs -Winline -Wparentheses -Wno-missing-braces


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-04-2005 à 20:46:44   

Reply

Marsh Posté le 25-04-2005 à 20:51:17    

Emmanuel Delahaye a écrit :

Un peu plus que ça!
 
-W -Wall -O2 -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wredundant-decls -Wnested-externs -Winline -Wparentheses -Wno-missing-braces


 
 
 :jap:  
 
Je note ca dans un coin merci.


---------------
.
Reply

Marsh Posté le 26-04-2005 à 10:19:34    

cricri_ a écrit :

vi, mais là il faut que tu fasses une copie, pas une affectation avec ton type chaine, genre :
strcpy( c->nom, ptr);


 
 
C'est ce que j'ai pensé à faire au début aussi. Mon programme compile bien, mais j'ai "votre programme a généré une erreur, il va être fermé..." quand j'execute ma fonction.
 

Code :
  1. switch (i) {
  2.                             case 1 :        strcpy(c->numero, ptr);           break;
  3.                             case 2 :        strcpy(c->nom, ptr);              break;
  4.                             case 3 :        strcpy(c->prenom, ptr);           break;
  5.                             case 4 :        strcpy(c->tel, ptr);              break;
  6.                             case 5 :        strcpy(c->mail, ptr);             break;
  7.                             case 6 :        strcpy(c->num_secteur, ptr);      break;
  8.                      }


---------------
Cptn.Barberousse
Reply

Marsh Posté le 26-04-2005 à 10:21:29    

Emmanuel Delahaye a écrit :

Pour avoir la version qui compile, faut payer ?


 
Je veux bien te filer tout mon code, mais il est assez conséquent  :o  
Je t'envoi un mp  :)


---------------
Cptn.Barberousse
Reply

Marsh Posté le 26-04-2005 à 11:20:48    

Sinan a écrit :

C'est ce que j'ai pensé à faire au début aussi. Mon programme compile bien, mais j'ai "votre programme a généré une erreur, il va être fermé..." quand j'execute ma fonction.


Mais c'est autre problème, en tout cas c'est la bonne méthode.
Après cela peut venir d'un débordement, essaye de vérifier ça ou bien de ne copier que ce que peut contenir ton type chaine par exemple.
 

Reply

Marsh Posté le 26-04-2005 à 11:23:26    

Qu'est ce que tu apelles débordement ?


---------------
Cptn.Barberousse
Reply

Marsh Posté le 26-04-2005 à 11:27:38    

ton tableau fait une certaine taille, mais à aucun moment tu ne vérifie à la copie que tu ne dépasses pas cette taille, d'où le débordement possible si la source est plus grande que la destination ;)

Reply

Marsh Posté le 26-04-2005 à 17:12:18    

même en faitsant un  
 

Code :
  1. switch (i) {
  2.                             case 1 :        strcpy(c->numero, "toto" );           break;
  3.                             case 2 :        strcpy(c->nom, "toto" );              break;
  4.                             case 3 :        strcpy(c->prenom, "toto" );           break;
  5.                             case 4 :        strcpy(c->tel, "toto" );              break;
  6.                             case 5 :        strcpy(c->mail, "toto" );             break;
  7.                             case 6 :        strcpy(c->num_secteur, "toto" );      break;
  8.                      }


 
mon programme plante.  
C'est le c->truc qui m'embete mais je sais pas pourquoi  :cry:  
 


---------------
Cptn.Barberousse
Reply

Marsh Posté le 26-04-2005 à 17:16:00    

Sinan a écrit :

mon programme plante.  
C'est le c->truc qui m'embete mais je sais pas pourquoi  :cry:


 
 
Normal :
 

Code :
  1. # candidature *tete_cand = NULL;
  2. (...)
  3. # c=(candidature*)malloc(sizeof(candidature)); 
  4. #     c = tete_cand;


 
En gros :
 
1. Tu alloues de la mémoire pour "c" avec malloc
2. Ligne suivante, tu écrases ton beau pointeur qui pointe vers ta zone mémoire allouée par NULL
 
Deux effets, donc :
1. Tu as alloué de la mémoire pour rien et perdu le moyen de la désallouer ensuite
2. "c" pointe vers NULL, donc tout appel à c->variable te redirigera vers une zone mémoire inexistante = plantage
 
 
Solution : efface la ligne "c = tete_cand;"
 
 
EDIT : pour t'aider à tracer ce genre de souci plus tard, n'hésite pas à examiner l'adresse de tes pointeurs sous ton debugger favori. :)


Message édité par Elmoricq le 26-04-2005 à 17:20:04
Reply

Sujets relatifs:

Leave a Replay

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