Les structures ... tableaux .. le mien marche po ... [C] - C++ - Programmation
Marsh Posté le 20-06-2002 à 01:24:04
Pour moi c'est correct.
Seul problème, le type de TotalOccur ne peut plus être utilisé pour d'autres créations de variables.
warning1: tu ne te sert pas de ta variable
warning2: ça doit concerner autre chose
Marsh Posté le 20-06-2002 à 07:59:27
Les tableaux de structure c pas forcément top d'u npoint de vue place mémoire (gros enplacement contigü utilisé). Mieu vaux le tableau de pointeur vers des structures à mon avis. si non la déclaration est bonne.
Marsh Posté le 20-06-2002 à 08:28:17
letoII a écrit a écrit : Les tableaux de structure c pas forcément top d'u npoint de vue place mémoire (gros enplacement contigü utilisé). Mieu vaux le tableau de pointeur vers des structures à mon avis. si non la déclaration est bonne. |
et ça donne quoi ce que tu dis ?
En fait ji réécris la chose ...
typedef struct {
char* table;
double occur;
} TotalOccur;
TotalOccur TabTotalOccur[2000];
donc ça c'est nickel ?
MErci
Marsh Posté le 20-06-2002 à 08:46:16
J'écrirai plutôt:
Code :
|
Et quand tu veux rajouter une structure dans ton tableau:
Code :
|
Ne pas oublier de libérer la mémoire ensuite:
Code :
|
Marsh Posté le 21-06-2002 à 03:09:24
pas besoin de se prendre la tete autant.
Code :
|
Marsh Posté le 21-06-2002 à 09:06:09
Code :
|
Pour le free j'ai un doute
Marsh Posté le 21-06-2002 à 09:57:08
la viper a écrit a écrit : pas besoin de se prendre la tete autant.
|
free(tab); c'est faux!!!!
faut parcourir chaque case de ton tab et freeer chaque cases
mais avant de freeer la case pas oublier de freeer son contenus (style le char *)
la tu free que la 1er case de ton tableau (meme pas con contenus et tu zap 19999 elements (qui eux sont encore la)
fuites memoire POWWWAAAAA
et le 2000 ca aussi c'st coton pour les fuites memoires (je sait qu'a lheure actuel nos pc sont bourés de ram) mais c'est pas un raison pour faire du mass malloc
par contre pour le C++ je sait pas si le delete sufit ...ou faut il faire comme le c freer toute les structures + contenus avant (ca devrais aps si ses destructeurs son ok mais bon )
Marsh Posté le 21-06-2002 à 10:01:43
koulip31 a écrit a écrit : free(tab); c'est faux!!!! faut parcourir chaque case de ton tab et freeer chaque cases mais avant de freeer la case pas oublier de freeer son contenus (style le char *) la tu free que la 1er case de ton tableau (meme pas con contenus et tu zap 19999 elements (qui eux sont encore la) fuites memoire POWWWAAAAA et le 2000 ca aussi c'st coton pour les fuites memoires (je sait qu'a lheure actuel nos pc sont bourés de ram) mais c'est pas un raison pour faire du mass malloc |
FAUX.
Il alloue l'espace pour 2000 structures disposées de façon contigue en mémoire, et place un pointeur vers cet espace dans tab.
Lorsqu'il fait free(tab) il libère TOUT cet espace.
Marsh Posté le 21-06-2002 à 10:02:53
letoII a écrit a écrit : FAUX. Il alloue l'espace pour 2000 structures disposées de façon contigue en mémoire, et place un pointeur vers cet espace dans tab. Lorsqu'il fait free(tab) il libère TOUT cet espace. |
Marsh Posté le 21-06-2002 à 10:03:38
letoII a écrit a écrit : Quel doute? |
letoII a écrit a écrit : FAUX. Il alloue l'espace pour 2000 structures disposées de façon contigue en mémoire, et place un pointeur vers cet espace dans tab. Lorsqu'il fait free(tab) il libère TOUT cet espace. |
C'est la que j'ai un doute.
Marsh Posté le 21-06-2002 à 10:04:34
Faire un free su chaque unité était nécessaire que s'il avait fait:
Code :
|
Car là pour chaque case du tableau il devrait faire:
Code :
|
Marsh Posté le 21-06-2002 à 10:04:46
koulip31 a écrit a écrit : |
thooo jai capiche
(c'est comme pour une string la koi )
c'est dut a son tab[300]
mais les char * de ses struct eux faut bien les freer???
Marsh Posté le 21-06-2002 à 10:05:07
Moi j'ai pas de doute et si je me plante c que j'ai mal lu et qu'il fait pas ce que je pense.
Marsh Posté le 21-06-2002 à 10:06:25
Par contre c un delete[] qu'il doit faire dans la version c++ (faute de frappe sans doute).
Code :
|
Marsh Posté le 21-06-2002 à 10:07:59
letoII a écrit a écrit : Moi j'ai pas de doute et si je me plante c que j'ai mal lu et qu'il fait pas ce que je pense. |
pour le C faut bien quil free ses strings avant (car en fesant un free tab) il vas detruire le tableau mais pas son contenus
surtout le char *
Marsh Posté le 21-06-2002 à 10:08:31
Pour le delete[]
Pour le tab je sais plus, j'utilise que des listes chainees (ou la faut freer link par link)
Marsh Posté le 23-06-2002 à 02:47:20
letoII a écrit a écrit : Les tableaux de structure c pas forcément top d'u npoint de vue place mémoire (gros enplacement contigü utilisé). Mieu vaux le tableau de pointeur vers des structures à mon avis. si non la déclaration est bonne. |
Voyons voir...
Taille du pointeur: 4 octets
Taille du double: 8 octets
Taille de la structure: 4+8=12 octets
Taille d'un tableau de 2'000 structures: 2'000*12 = 24'000 octets, soit 23,4375 Ko.
Oulàla... c'est que je ne sait pas si ça tient dans la mémoire du PC, qui doît être au moins de 32 Mo, soit 33'554'432 octets.
Sans parler du risque d'épuiser l'espace d'adressage vituel limité à 4 Go (soit 4294967296 octets) sur nos pauvres machines 32 bits.
Avec la solution d'un tableau de pointeurs sur des structures allouées par new, on rajoute pour chaque structure crée un pointeur (4 octets), plus ce que new mémorise pour s'y retrouver (au moins un int), plus les risques de bogues accrus, plus un ralentissement de l'exécution...
Franchement, ça ne servirait à rien !
koulip31 a écrit a écrit : pour le C faut bien quil free ses strings avant (car en fesant un free tab) il vas detruire le tableau mais pas son contenus surtout le char * |
Pour que ce soit libéré, il suffit de doter la structure d'un destructeur, c'est fait pour ça.
Et comme un char* n'a pas de destructeur, il est logique que ce qu'il pointe ne soit pas libéré.
Un peu de bon sens, quoi !
Marsh Posté le 23-06-2002 à 23:18:52
musaran a écrit a écrit : Pour que ce soit libéré, il suffit de doter la structure d'un destructeur, c'est fait pour ça. Et comme un char* n'a pas de destructeur, il est logique que ce qu'il pointe ne soit pas libéré. Un peu de bon sens, quoi ! |
sauf rien indique que c du C++ dans lexemple de base (pas les solution apporte)
et moi quand je free un tablea j'ai lhabitde bien le freer (sans laisser de char *)
mis bon c'ettais une question a part
Marsh Posté le 24-06-2002 à 21:38:10
musaran a écrit a écrit : Voyons voir... Taille du pointeur: 4 octets Taille du double: 8 octets Taille de la structure: 4+8=12 octets Taille d'un tableau de 2'000 structures: 2'000*12 = 24'000 octets, soit 23,4375 Ko. Oulàla... c'est que je ne sait pas si ça tient dans la mémoire du PC, qui doît être au moins de 32 Mo, soit 33'554'432 octets. Sans parler du risque d'épuiser l'espace d'adressage vituel limité à 4 Go (soit 4294967296 octets) sur nos pauvres machines 32 bits. Avec la solution d'un tableau de pointeurs sur des structures allouées par new, on rajoute pour chaque structure crée un pointeur (4 octets), plus ce que new mémorise pour s'y retrouver (au moins un int), plus les risques de bogues accrus, plus un ralentissement de l'exécution... Franchement, ça ne servirait à rien ! Pour que ce soit libéré, il suffit de doter la structure d'un destructeur, c'est fait pour ça. Et comme un char* n'a pas de destructeur, il est logique que ce qu'il pointe ne soit pas libéré. Un peu de bon sens, quoi ! |
Ouai un destructeur en C bravo, quant à la mémoire le jour où il bossera avec des données plus volumineuses ou sur une bécanne un tant soit peu chargée d'un point de vue mémoire le tableau de pointeur sera peut être bien apréciable.
Marsh Posté le 26-06-2002 à 02:10:04
letoII a écrit a écrit : Ouai un destructeur en C bravo, quant à la mémoire le jour où il bossera avec des données plus volumineuses ou sur une bécanne un tant soit peu chargée d'un point de vue mémoire le tableau de pointeur sera peut être bien apréciable. |
Pardonnez-moi, j'avais perdu de vue que c'était du C.
Tout ces malloc et free m'ont fait irrésistiblement penser à new et delete.
Le problème de la surconsommation de mémoire reste le même...
Pour des tableaux plus grands je dis pas...
Mais là, ce serait vraiment du masochisme !
Marsh Posté le 26-06-2002 à 02:14:24
J'oubliais de dire :
Si on a des allocations/désallocations bien complexes, je trouve que les constructeurs/destructeurs du C++ sont très bien pour s'en occuper.
Marsh Posté le 26-06-2002 à 03:54:14
musaran a écrit a écrit : Pardonnez-moi, j'avais perdu de vue que c'était du C. Tout ces malloc et free m'ont fait irrésistiblement penser à new et delete. Le problème de la surconsommation de mémoire reste le même... Pour des tableaux plus grands je dis pas... Mais là, ce serait vraiment du masochisme ! |
C'est aussi mon avis:
Pour les tableaux plus grands, soit ils sont creux et il y a des algos adaptés, soit ils occupent de toute facon autant de memoire, simplement au lieu d'avoir adressé une zone virtuelle contigue de grande taille, on adresse de multiples zones plus petites, mais c'est exactement ce qu'un allocateur bien foutu va faire dans le premier cas.
L'interet d'un tableau de pointeurs serait la si on ne savait pas la borne du tableau, et qu'on alloue par tranches de n structures au fur et a mesure des besoins.
A+,
Marsh Posté le 28-06-2002 à 00:56:38
Et puis même si on a un très grand tableau...
On a la mémoire virtuelle qui s'en occupera très bien si on n'accède pas à tout en même temps.
Marsh Posté le 28-06-2002 à 09:07:19
letoII a écrit a écrit : Quel doute? |
Pourquoi faire une allocation memoire de 2000x la structure à la place de TotalOccur tableau[2000] ?
Au moins avec le tableau déclaré dés le départ y'a pas de problème, on est sûr qu'il sera bien créé. (Ca fait pas mal de temps que je fais du C et je me suis aperçu que plus y'a de "malloc" dans un programme plus y'a de "coredump" !!! alors des que je peux eviter j'evite (Quand je connais la taille et la quatite des donnees bien sûr)).
Marsh Posté le 28-06-2002 à 10:24:40
DarkOli a écrit a écrit : Pourquoi faire une allocation memoire de 2000x la structure à la place de TotalOccur tableau[2000] ? Au moins avec le tableau déclaré dés le départ y'a pas de problème, on est sûr qu'il sera bien créé. (Ca fait pas mal de temps que je fais du C et je me suis aperçu que plus y'a de "malloc" dans un programme plus y'a de "coredump" !!! alors des que je peux eviter j'evite (Quand je connais la taille et la quatite des donnees bien sûr)). |
J'aurais plutôt mis ça sur le compte des free, moi...
A+,
Marsh Posté le 28-06-2002 à 10:37:17
DarkOli a écrit a écrit : Pourquoi faire une allocation memoire de 2000x la structure à la place de TotalOccur tableau[2000] ? Au moins avec le tableau déclaré dés le départ y'a pas de problème, on est sûr qu'il sera bien créé. (Ca fait pas mal de temps que je fais du C et je me suis aperçu que plus y'a de "malloc" dans un programme plus y'a de "coredump" !!! alors des que je peux eviter j'evite (Quand je connais la taille et la quatite des donnees bien sûr)). |
Mouai, la grosse raison pour faire ça plutôt qu'une allocation dynamique c plutôt que new ou malloc c vachement lent, donc si on a besoin de vitesse vaut mieux éviter.
Marsh Posté le 30-06-2002 à 01:14:15
euh dites juste une question la, ca fait combien de temps que vous faites de la programmation(c pas pour me vanter mais au contraire parce que je suis impressionné)
merci de me repondre.
Marsh Posté le 02-07-2002 à 00:36:51
bailly33: Tu as posé la question beaucoup d'endroits ?
Tu peux en faire un topic séparé, c'est plus poli et mieux pour ceux que ça intéresse aussi.
Marsh Posté le 02-07-2002 à 08:50:07
gilou a écrit a écrit : J'aurais plutôt mis ça sur le compte des free, moi... A+, |
Euh ben c'est les deux en fait mais j'ai déjà quelques prolèmes avec des mallocs (ils étaient plus nombreux que les frees ... et à la fin une variable qui n'avait rien demandee etait effacee malgré elle).
Marsh Posté le 19-06-2002 à 22:19:53
Dites c'est très laid ça ?
ca marche po ..
j'obtiens :
E:\BTS\pti\greper\grep.c(137) : warning C4101: 'TotalOccur' : unreferenced local variable
E:\BTS\pti\greper\grep.c(147) : warning C4700: local variable 'temp' used without having been initialized