Pointeur de structur qui fait tout cracher

Fermé
casers Messages postés 49 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008 - 30 nov. 2007 à 17:08
casers Messages postés 49 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008 - 1 déc. 2007 à 15:01
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);

}

17 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
30 nov. 2007 à 17:17
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
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 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
30 nov. 2007 à 22:52
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
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 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 435
30 nov. 2007 à 23:07
comment tu as fais ton malloc ?
0
casers Messages postés 49 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
1 déc. 2007 à 00:02
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 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 435
1 déc. 2007 à 00:05
essaye en faisant un cast
Client =(StructClient *)  malloc(sizeof(StructClient));
0
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 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
1 déc. 2007 à 10:40
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
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
mais pas de chacun des champs ou de ta variable ligne (transformée en char *)
0
casers Messages postés 49 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
1 déc. 2007 à 11:11
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 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
1 déc. 2007 à 11:27
enfin quand je parle de newbee c pour le c principalement.
0
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 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
1 déc. 2007 à 13:08
OK j'ai compris.
C quand meme super simpa de prendre du temps pour expliquer.
Encore merci
0
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 Date d'inscription dimanche 18 novembre 2007 Statut Membre Dernière intervention 3 juin 2008
1 déc. 2007 à 15:01
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