Pointeur de structur qui fait tout cracher
casers
Messages postés
49
Statut
Membre
-
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);
}
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:
- Pointeur de structur qui fait tout cracher
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Structure d'un rapport de stage - Guide
- Le pointeur de mon pc portable ne marche plus - Guide
- Logiciel de calcul de structure gratuit - Télécharger - Architecture & Déco
17 réponses
Bonsoir,
Je cite :
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 :
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.
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.
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
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
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???
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???
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( ...
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( ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...
#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...
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.
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.
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.
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.
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.
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.
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...
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...
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 :
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.
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.
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.
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?
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?