Pointeur de structur qui fait tout cracher

casers Messages postés 49 Statut Membre -  
casers Messages postés 49 Statut Membre -
Bonjour,
j'ai construi un pti prog debile pour reussir a afficher les donnée d'un fichier par le moyen de structre de pointeur. Mais a chaque fois que j'essaie d'affecter la valeur de mon fichier au structure afin de les afficher sa crache!! meme avec ds malloc etc...
que faire???
je vous envoi la source de mojn code.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Constantes.H"

//Definition de la structure associé au clients
typedef struct StructClient
{char *CodeClient;
char *NomClient;
char *MDP;
char *SoldeCompteClient;
}StructClient;

StructClient *Client = NULL;

char A;
char ligne[255];
char *p;

int main(void)
{
// Ouverture du fichier.
FILE *FC;
FC = fopen("FOURNISSEURS.CSV","r+");

// La construction de l'arbre ce fera par lecture sequentielle du fichier qui
// repertorie les clients.

while(p=fgets(ligne, sizeof(ligne),FC), !feof(FC))
{
printf("%s\n",ligne);

// Il faut ensuite replacer la ligne lue dans la structure.

strcpy(Client->CodeClient,strtok (ligne,";"));
Client->NomClient = strtok (NULL,";");
Client->MDP = strtok (NULL,";");
Client->SoldeCompteClient = strtok (NULL,";");
printf("%s\n","*************************************");
printf("%s\n%s\n%\n%d\n",Client->CodeClient,Client->MDP,Client->NomClient,Client->SoldeCompteClient);
gets(&A);
}
fclose(FC);

}
A voir également:

17 réponses

kij_82 Messages postés 4260 Statut Contributeur 857
 
Bonsoir,

Je cite :
 meme avec ds malloc etc


Mum.. ca m'étonnerai grandement que tu ai tenté d'initialiser ton pointeur sur ta structure sinon ton programme fonctionnerait.
Pour mettre quelque chose dans ta structure, il faut d'abord que tu lui alloue de la mémoire (via malloc), donc tu dois faire cette opération avant ta boucle while comme suit :
client = malloc ( sizeof(struct *StructClient ) );

while ( lecture du fichier) {
}


Bien sur ce que je te donne là c'est l'idée, ca fait des années que je n'ai pas fais de C et la syntaxe exact pour allouer de la mémoire... reste à chercher cette syntaxe par toi même.
0
le père
 
Bonjour

meme avec ds malloc

Les malloc, comme le reste, ça ne s'essaye pas au petit bonheur à la chance comme ça, pour voir ce que ça donne...

strcpy(Client->CodeClient,strtok (ligne,";")); tu te sers du pointeur Client initialisé à NULL. Il faut qu'il pointe sur quelque chose. Un malloc est indispensable. Pense à désallouer : tu peux faire le malloc à l'intérieur du while, mais alors désalloue aussi à l'intérieur du while. Si tu fais le malloc à l'extérieur, désalloue aussi à l'extérieur.

Tu n'es pas au bout de tes peines. Les champs de ta structure StructClient sont aussi des pointeurs. Il faut les initialiser sur quelque chose avant de les utiliser.
Client->CodeClient ne peut pas être la destination d'un strcpy, car il pointe à un endroit indéterminé
par contre, Client->NomClient = strtok (NULL,";"); est une 'bonne' initialisation, il fait pointer NomClient quelque part dans 'ligne'. Sois quand même conscient que NomClient ne contient pas une copie d'un morceau de ligne : si tu fais quelque chose du genre Client->NomClient[2]='a', alors ligne sera modifiée aussi
0
casers Messages postés 49 Statut Membre
 
ben merci bcp pour les reponces.
sa marche parfaitement en fesant un simple malloc et en elevant l'initizlisation de client sur NULL. Tout cela sur le compilateur de mon ecole.
Mais maitenant que je suis a la maison et que j'essai de compiler on me dit que le pointeur retourné par malloc est un void* et pas compatible avec un char* !!!!!! sa veut rien dire, sa devrai justement marcher!!!
j'utilise devc++, comment resoudre le pb???
0
le père
 
Tu as fait un malloc sur quoi ? D'après moi, il y en a au moins 2 à faire. Je demande à voir ! Peux-tu montrer le code ?

Quant à ton problème de type incompatible, c'est normal. Le compilateur que tu as chez toi est plus rigoureux que celui que tu as à l'école : ce n'est pas le même, ou il y a une option (qui pourrait s'appeler warning level) réglée différemment.
La foncion malloc rendant un void *, on ne peut pas directement l'affecter à un StructClient *
Il suffit de forcer le type ('type casting')
Client = (StructClient *) (malloc (sizeof(...
Client->CodeClient = (char *) malloc( ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mype Messages postés 2449 Statut Membre 437
 
comment tu as fais ton malloc ?
0
casers Messages postés 49 Statut Membre
 
voila pour le code que j'utilise a l'ecole:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Constantes.H"

//Definition de la structure associé au clients
typedef struct StructClient
{char *CodeClient;
char *NomClient;
char *MDP;
char *SoldeCompteClient;
}StructClient;

StructClient *Client = NULL;

char A;
char ligne[255];
char *p;

int main(void)
{
// Ouverture du fichier.
FILE *FC;
FC = fopen("FOURNISSEURS.CSV","r+");

// La construction de l'arbre ce fera par lecture sequentielle du fichier qui
// repertorie les clients.

while(p=fgets(ligne, sizeof(ligne),FC), !feof(FC))
{
printf("%s\n",ligne);

// Il faut ensuite replacer la ligne lue dans la structure.

Client = malloc(sizeof(StructClient));
Client->CodeClient = strtok (ligne,";");
Client->NomClient = strtok (NULL,";");
Client->MDP = strtok (NULL,";");
Client->SoldeCompteClient = strtok (NULL,";");

free(Client);
}
fclose(FC);

}

sa marche TOP!!!

mais chez moi rien. j'ai meme essayéde forcer le malloc avec un Client->NomCclient, mais il le donne toujours la meme reponce.

Client->CodeClient = malloc(sizeof(StructClient));

reponce: 35 C:\Users\Vasco\Desktop\TESTLECFICH.cpp invalid conversion from `void*' to `char*'

c extrement chelou parceque celon moi le faite que le pointeur soit un void* sa veu dire justement qu'il s'adapte a la forme de la valeur...
0
mype Messages postés 2449 Statut Membre 437
 
essaye en faisant un cast
Client =(StructClient *)  malloc(sizeof(StructClient));
0
le père
 
sa marche parfaitement en fesant un simple malloc et en elevant l'initizlisation de client sur NULL
Tu n'as pas enlevé l'initailisation de client sur NULL, mais tu as retiré le strcpy(Client->CodeClient,strtok (ligne,";")); qui n'avait aucune chance de marcher tel, c'est pour ça que je t'ai demandé à voir ton code.
D'ailleurs tu ne l'as pas tout donné, il manque au moins le printf pour voir que les pointeurs sont bien sur les champs.

Je suppose (?) que tu es conscient que si tu dois faire un arbre à partir des enregistrements lus, tu seras <bold>obligé</bold> de faire des malloc pour chaque champ de ta structure, ou pour chque nouvelle ligne lue. Mais bon, chaque chose en son temps.
0
casers Messages postés 49 Statut Membre
 
ouai je suis con j'ai pas enlevé le NULL(mais je l'ai fai mon ecole, je jure!^^). Puis je l'ai testé ( a mon ecole) avec le debug et les champs de la structure etaient bien affecté.
Sinon pour ce qui est de l'arbre noir et rouge (et ouai..) j'ai code toute les fonction: creation du noeud racine et insertion d'un noeud avec les controles relatifs a la couleur des noeuds et changement si necessaire...etc
Mais ce que je contais faire c'etait; sur la base de ce petit prog, lancer a la suite, dans le while, les fonction de construction de l'arbre et sa va faire un malloc pour chaque enregistrement donc sa devrai etre bon...

Sinon en fesant un cast sa marche sur dev c++....enfaite faut lui expliciter ce que c'est.
merci pour l'aide.
0
le père
 
sa va faire un malloc pour chaque enregistrement

Si tu fais un malloc de StructClient, mais pas de chacun des champs de StructClient, je te garantis que ça ne marchera pas.

Mais je suis sidéré de voir que tu es capable de créer un arbre, objet totalement dynamique s'il en est, qui demande une bonne maîtrise des pointeurs, et qu'à côté de ça tu fasses les erreurs qu'on voit au début de ce fil.

Bon courage pour la suite et n'hésite pas à revenir.
0
le père
 
mais pas de chacun des champs ou de ta variable ligne (transformée en char *)
0
casers Messages postés 49 Statut Membre
 
Pourquoi un malloc pour chaqu'un des champs??
Bon pour ce qui regarde les arbre je suis un newbee donc c clair mon code ne doit pas etre top. Dailleur j'ai pas encore super bien compris comment on utilise les fonction et les definitions enfin j'ai plutot pas encore testé.
Puis naturellement je me suis "fortement inspiré" de ce que j'ai pu voir sur internet (surtout pour le noir et rouge...heheheheh).

J'ai juste un dernier truc a faire avant de pouvoir tout finaliser c'est de faire une fonction de roulagegauche et droite. J'ai touvé des trucs que j'essai d'adapté mais sa n'a pas l'air evident...
0
casers Messages postés 49 Statut Membre
 
enfin quand je parle de newbee c pour le c principalement.
0
le père
 
Pourquoi un malloc pour chaqu'un des champs??

N'ayons pas peur de nous répéter :-)

Quand tu fais Client->NomClient = strtok (NULL,";"); ,NomClient pointe quelque part dans ta variable ligne .
donc tu peux faire un printf avec Client->NomClient, pas de problème.
Quand dans la boucle suivante tu lis une autre ligne, elle remplace la précédente (tu n'as qu'un seul tableau de chars : ligne).
La donnée pointée par Client->NomClient a été remplacé par autre chose.
La seule façon de t'en sortir, c'est d'allouer de la mémoire pour chaque champ :
 char * debut;
...
  debut = strtok (ligne,";");          // début d'un des champs
  Client->CodeClient = malloc(strlen(debut)+1);  // on alloue la mémoire
  strcpy(Client->CodeClient,debut);      // on garde une copie


Mais n'ouble pas que toute mémoire allouée devra être désallouée un jour. Tu devrais normalement le faire lors de la destruction de ton arbre ou de la suppression d'un de ses éléments.
0
casers Messages postés 49 Statut Membre
 
OK j'ai compris.
C quand meme super simpa de prendre du temps pour expliquer.
Encore merci
0
le père
 
De rien. C'est agréable d'expliquer à quelqu'un qui essaye de comprendre, quand on voit le nombre de ceux qui attendent qu'on leur serve un programme tout cuit.
0
casers Messages postés 49 Statut Membre
 
Pour mon prog il faut que je puisse ensuite lister par ordre un certain nombre de client prealablement cherche. jme disait que pour les ordonne y serai plus facile de recree a chaque foi un arbre mais avec comme element de comparaisont un element different. au lieu d'extraire d'abort les donne et ensuite les retravailler pour les metre en ordre...
Pi ya pete moyen aussi de cree plusieur arbre sur un seul fichier? mais sa aucupe peutetre trop de memoire?
C koi les solutions les plus rentable?
0