Il faudrait que tu actives les warnings dans ton IDE (EDI) ..
Parce que tu passes à travers les erreurs de cast et bien d'autre encore sans ça ...
Il faudrait que tu actives les warnings dans ton IDE (EDI) ..
Parce que tu passes à travers les erreurs de cast et bien d'autre encore sans ça ...
J'ai choisi la pillule bleue, c'est à dire, de tout mettre dans un tableau de structure de taille fixée... Parler c'est simple, implémentez c'est autre chose (à mon niveau).
Je pense qu'il y a une erreur car mes tests dans le main me donne des résultats louches...
J'ai changé un peu la structure et j'ai viré la fonction StrToLong... Qu'en pensez vous? Pouvez vous m'aider ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 #include <stdio.h> #include <stdlib.h> #include <string.h> #define DELIM "," #define BUF_SIZE 10000 typedef struct { char * nom; int nbH; int nbF; } infos_p; //tres utile pour le switch typedef enum { NOM, NBH, NBF } infos_type; static char * copie_chaine(const char *chaine) { char * copie = NULL; if (chaine != NULL) { size_t taille = strlen (chaine) + 1; / copie = malloc (taille * sizeof *copie); if (copie != NULL) { *copie = '\0'; strcat(copie, chaine); } } return copie; } static void term_chaine(char *chaine) { char * p = strchr(chaine, '\n'); if(p != NULL) { *p = 0; } } infos_p* get_infos(const char * file) { infos_p * infos = NULL;//structure de retour infos_p * tab[227]; // comment je l initialise ? NULL ? {0} ? FILE * fic = NULL; char * k = NULL; char buff [10000] = "";//Tampon fic = fopen(file, "r"); if (fic != NULL) { printf("Ouverture du fichier reussie.\n \n"); while ((fgets (buff, sizeof buff, fic)) != NULL) { char * p = buff; int i = 0;//compteur mot int j = 0; term_chaine(buff); infos = malloc (sizeof (* infos)); if (infos != NULL) { /* l'utilisation de strtok() a le desavantage d'utiliser un tampon statique pour stocker la chaine entre deux appels, ce qui la rend non réentrante et thread-unsafe.*/ while ((k = strtok(p, ",")) != NULL) { if (i == 0) { p = NULL; } switch (i) { case NOM: infos->nom = copie_chaine(k); break; case NBH: { int nbH = strtol(k,NULL,10); infos -> nbH = nbH ; // ou bien infos.nbH = nbH ? } break; case NBF: { int nbF = strtol(k,NULL,10); infos -> nbF = nbF ;// de meme ? } break; } i++; //mot suivant } tab[j]=infos; } j++; } /* Une fois que fic est ferme, on reaffecte a fic une adresse invalide testable, a savoir NULL */ fclose(fic),fic = NULL; } return infos; //free(infos); }
Merci d'avance.
Bonjour,
puisque tu connais le nombre exact de structures, je pense que tu pourrais simplifier ton code en déclarant un tableau "en dur", c'est à direCela t'éviterait d'avoir à utiliser malloc, et à avoir à te soucier des free ensuite, sans compter que tu gagnerais en concision.
Code : Sélectionner tout - Visualiser dans une fenêtre à part infos_ tab[227];
Pour initialiser un tableau, il suffit d'écrire :
Dans ta version actuelle, il faudrait utiliser NULL et non 0 puisque ce sont des pointeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int tab[34] = {0};
Je viens de comprendre ton problème :
- lorsque tu crées une variable dans une fonction, elle est détruite au moment où le programme quitte la fonction (on dit que le programme a quitté le scope de la fonction). Deux exceptions : les variables déclarées static qui ne sont pas détruites et seront identiques à chaque appel de la fonction et les zones de mémoires malloquées. Pour ce deuxième cas, la zone mémoire malloquée en elle-même n'est pas détruite, mais un pointeur oui, ce qui conduit à des fuites mémoires car tu as perdu l'accès à de la mémoire de ton programme que tu ne pourras pas récupérer.
- à la lumière de cela, qu'arrive-t-il à "tab" au moment où le programme quitte le scope de la fonction get_infos ? Les pointeurs sont-ils détruits ?
Et une dernière question : à la fin de get_infos, tu retournes une structure info_p. A quoi sert-elle, que contient-elle ?
Erreur d incompatibilité avec tab :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 infos_p get_infos(const char * file) { infos_p infos = {0};//structure de retour infos_p tab[227]= {{0}}; FILE * fic = NULL; char * k = NULL; char buff [10000] = "";//Tampon fic = fopen(file, "r"); if (fic != NULL) { printf("Ouverture du fichier reussie.\n \n"); while ((fgets (buff, sizeof buff, fic)) != NULL) { char * p = buff; int i = 0;//compteur mot int j = 0; term_chaine(buff); // infos = malloc (sizeof (* infos)); // if (infos != NULL) // { /* l'utilisation de strtok() a le desavantage d'utiliser un tampon statique pour stocker la chaine entre deux appels, ce qui la rend non réentrante et thread-unsafe.*/ while ((k = strtok(p, ",")) != NULL) { if (i == 0) { p = NULL; } switch (i) { case NOM: infos->nom = copie_chaine(k); break; case NBH: { int nbH = strtol(k,NULL,10); infos.nbH = nbH ; } break; case NBF: { int nbF = strtol(k,NULL,10); infos.nbF = nbF ; } break; } i++; //mot suivant } tab[j]=infos; // } j++; } /* Une fois que fic est ferme, on reaffecte a fic une adresse invalide testable, a savoir NULL */ fclose(fic),fic = NULL; } return tab //free(infos); }
" incompatible types when returning type 'struct infos_p *' but 'infos_p' was expected|
||=== Build finished: 1 errors, 0 warnings ===| "
Et puis mon but reste de pouvoir accéder à n'importe quel champ de n importe quelle structure qui devrait se trouver dans mon tableau... seulement j'ai l impression que je place mal mon tab[j] = infos...
ex : tab[34].nbH me renvoie le nbH de la 35eme structure qui a été rentrée dans le tableau...
ton return tab; ne convient pas avec le type de retour que tu as choisi infos_p. En effet selon ta déclaration infos_p tab[227]= {{0}}; cette variable est d'un type assimilable à infos_p*.
Accorde ta valeur de retour avec la signature de ta fonction ou fait l'inverse (accorder ta signature de fonction avec la valeur que tu retourne).
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
De toute façon, on ne doit pas retourner tab : il est interdit de retourner l'adresse d'une variable locale (parce qu'elle est détruite en sortie de fonction)
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
Merci mon ... heu merci TheGzD.... ca compile...
Edit : J'avais pas vu le commentaire de diogène... Je refais en conséquence...
Franchement, comment vais je faire pour ne pas craquer mentalement? Rien ne fonctionne comme je veux...
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
C'est sûr... j'aurais dû mieux écouter en cours...
Je reprends du début..
Je veux charger les données contenues dans le fichier CSV en mémoire.
Ma fonction get_infos peut elle ne rien retourner ? // Je ne pense pas...
Ou doit elle retourner un pointeur sur infos_p ? car d'apres ce que j'ai compris un simple tableau de structure infos_p déclaré " a la dure " est une variable locale donc supprimé à la fin de ma fonction.
Donc comment faire en sorte de remplir mes structures pour que je puisse les réutilisées par la suite ?
PS : Je vois bien que je tourne en rond depuis des jours, mais je trouve que la fonction d extraction avec le switch et strtok est bien d'ou mon acharnement à l utiliser.
Vous postez du code ? Merci d'utiliser les balises
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...
Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
__________________
Ingénieur R&D, diplômé en 2007 de l'ISIMA
Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand
Merci à tous...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager