Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2729 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1060054
Sinan
Posté le 25-04-2005 à 17:15:49  profilanswer
 

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
mood
Publicité
Posté le 25-04-2005 à 17:15:49  profilanswer
 

n°1060057
Sinan
Posté le 25-04-2005 à 17:17:29  profilanswer
 

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


---------------
Cptn.Barberousse
n°1060138
matafan
Posté le 25-04-2005 à 18:22:44  profilanswer
 

C'est quoi ce type "chaine" ?

n°1060143
cricri_
Posté le 25-04-2005 à 18:23:38  profilanswer
 

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

n°1060235
Tarabiscot​e
Posté le 25-04-2005 à 19:08:07  profilanswer
 

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
n°1060257
Sinan
Posté le 25-04-2005 à 19:22:50  profilanswer
 

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

n°1060275
cricri_
Posté le 25-04-2005 à 19:33:23  profilanswer
 

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

n°1060336
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-04-2005 à 20:08:10  profilanswer
 

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/
n°1060380
didier1809
${citation_perso}
Posté le 25-04-2005 à 20:36:30  profilanswer
 

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 ?


---------------
.
n°1060401
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-04-2005 à 20:46:44  profilanswer
 

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/
mood
Publicité
Posté le 25-04-2005 à 20:46:44  profilanswer
 

n°1060409
didier1809
${citation_perso}
Posté le 25-04-2005 à 20:51:17  profilanswer
 

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.


---------------
.
n°1060898
Sinan
Posté le 26-04-2005 à 10:19:34  profilanswer
 

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
n°1060902
Sinan
Posté le 26-04-2005 à 10:21:29  profilanswer
 

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
n°1060991
cricri_
Posté le 26-04-2005 à 11:20:48  profilanswer
 

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.
 

n°1060994
Sinan
Posté le 26-04-2005 à 11:23:26  profilanswer
 

Qu'est ce que tu apelles débordement ?


---------------
Cptn.Barberousse
n°1061000
cricri_
Posté le 26-04-2005 à 11:27:38  profilanswer
 

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 ;)

n°1061602
Sinan
Posté le 26-04-2005 à 17:12:18  profilanswer
 

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
n°1061607
Elmoricq
Modérateur
Posté le 26-04-2005 à 17:16:00  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
existence valeur dans un tableau ?liste lignes de fichiers d'un meme dossier
[PHP/XML] Afficher en fonction de sa valeur classer ? [maj][VB] Problème de décallage dans une liste...
Regex : chercher une valeur entre deux chainesajouter une même valeur à tous les éléments d'un tab...[autre quest°]
Probleme avec un Vector (élément écrasé lors du .add() )[C] Valeur reçue différente de la valeur retournée [Résolu]
test valeur myquery...[Delphi + Sql]Les champs dans une liste
Plus de sujets relatifs à : Affectation d'une valeur à un élément d'une liste chainée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR