Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3067 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C] Les structures ... tableaux .. le mien marche po ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Les structures ... tableaux .. le mien marche po ...

n°162884
paranoidan​droid
Posté le 19-06-2002 à 22:19:53  profilanswer
 

Dites c'est très laid ça ?
 

Code :
  1. struct {
  2.  char* table;
  3.  double occur;
  4. } TotalOccur[2000];


 
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

mood
Publicité
Posté le 19-06-2002 à 22:19:53  profilanswer
 

n°162958
Musaran
Cerveaulté
Posté le 20-06-2002 à 01:24:04  profilanswer
 

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


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°162969
LetoII
Le dormeur doit se réveiller
Posté le 20-06-2002 à 07:59:27  profilanswer
 

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.


---------------
Le Tyran
n°162972
paranoidan​droid
Posté le 20-06-2002 à 08:28:17  profilanswer
 

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

n°162976
LetoII
Le dormeur doit se réveiller
Posté le 20-06-2002 à 08:46:16  profilanswer
 

J'écrirai plutôt:

Code :
  1. typedef struct
  2.    char* table; 
  3.    double occur; 
  4. } TotalOccur;
  5. long nbOfStruct = 0;
  6. TotalOccur *tab[2000];


 
Et quand tu veux rajouter une structure dans ton tableau:
 

Code :
  1. tab[nbOfStruct++] = (TotalOccur*)malloc(sizeof(TotalOccur));


 
Ne pas oublier de libérer la mémoire ensuite:

Code :
  1. for(i = 0;i < nbOfStruct;++i)
  2. {
  3.     free(tab[i]);
  4. }


---------------
Le Tyran
n°163063
la viper
Posté le 21-06-2002 à 03:09:24  profilanswer
 

pas besoin de se prendre la tete autant.
 

Code :
  1. typedef struct
  2. {
  3. char *table;
  4. double occur;
  5. }
  6. TotalOccur;
  7. TotalOccur *tab;
  8. // initialisation
  9. tab =(TotalOccur*) malloc (2000*sizeof(TotalOccur));
  10. // ou tab = new TotalOccur[2000]; pour C++
  11. // suppression
  12. free(tab);
  13. // ou delete tab; pour C++


Message édité par la viper le 21-06-2002 à 03:09:44
n°163086
godbout
Génial.
Posté le 21-06-2002 à 09:06:09  profilanswer
 

Code :
  1. typedef struct _TABLEOCCUR
  2. {
  3. char *table;
  4. double occur;
  5. }TABLEOCCUR, *PTRTABLEOCCUR;
  6. ...
  7. PTRTABLEOCCUR tableOccur;
  8. tableOccur = (PTRTABLEOCCUR) malloc (2000 * sizeof(TABLEOCCUR));


 
Pour le free j'ai un doute :/


---------------
Super.
n°163125
LetoII
Le dormeur doit se réveiller
Posté le 21-06-2002 à 09:51:14  profilanswer
 

Quel doute?


---------------
Le Tyran
n°163129
koulip31
Posté le 21-06-2002 à 09:57:08  profilanswer
 

la viper a écrit a écrit :

pas besoin de se prendre la tete autant.
 

Code :
  1. typedef struct
  2. {
  3. char *table;
  4. double occur;
  5. }
  6. TotalOccur;
  7. TotalOccur *tab;
  8. // initialisation
  9. tab =(TotalOccur*) malloc (2000*sizeof(TotalOccur));
  10. // ou tab = new TotalOccur[2000]; pour C++
  11. // suppression
  12. free(tab);
  13. // ou delete tab; pour C++

 




 
 
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 )


Message édité par koulip31 le 21-06-2002 à 10:01:06
n°163130
LetoII
Le dormeur doit se réveiller
Posté le 21-06-2002 à 10:01:43  profilanswer
 

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.


---------------
Le Tyran
mood
Publicité
Posté le 21-06-2002 à 10:01:43  profilanswer
 

n°163131
koulip31
Posté le 21-06-2002 à 10:02:53  profilanswer
 

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.  




 
 :??:  :??:

n°163132
godbout
Génial.
Posté le 21-06-2002 à 10:03:38  profilanswer
 

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.


---------------
Super.
n°163133
LetoII
Le dormeur doit se réveiller
Posté le 21-06-2002 à 10:04:34  profilanswer
 

Faire un free su chaque unité était nécessaire que s'il avait fait:
 

Code :
  1. Struct **tab = (Struct**)malloc(sizof(Struct*)*2000);


 
Car là pour chaque case du tableau il devrait faire:
 

Code :
  1. tab[i] = (Struct*)malloc(sizeof(Struct));


---------------
Le Tyran
n°163134
koulip31
Posté le 21-06-2002 à 10:04:46  profilanswer
 

koulip31 a écrit a écrit :

 
 
 :??:  :??:  




 
thooo jai capiche  
 
(c'est comme pour une string la koi :p )  
c'est dut a son tab[300]  
 
mais les char * de ses struct eux faut bien les freer???

n°163137
LetoII
Le dormeur doit se réveiller
Posté le 21-06-2002 à 10:05:07  profilanswer
 

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.


---------------
Le Tyran
n°163138
LetoII
Le dormeur doit se réveiller
Posté le 21-06-2002 à 10:06:25  profilanswer
 

Par contre c un delete[] qu'il doit faire dans la version c++ (faute de frappe sans doute).
 

Code :
  1. delete[] tab;


---------------
Le Tyran
n°163139
koulip31
Posté le 21-06-2002 à 10:07:59  profilanswer
 

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 *

n°163140
godbout
Génial.
Posté le 21-06-2002 à 10:08:31  profilanswer
 

Pour le delete[]  [:super chinois]  
 
Pour le tab je sais plus, j'utilise que des listes chainees :D (ou la faut freer link par link)


---------------
Super.
n°163142
LetoII
Le dormeur doit se réveiller
Posté le 21-06-2002 à 10:10:00  profilanswer
 

:lol:


---------------
Le Tyran
n°163997
Musaran
Cerveaulté
Posté le 23-06-2002 à 02:47:20  profilanswer
 

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 !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°164275
koulip31
Posté le 23-06-2002 à 23:18:52  profilanswer
 

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 ;)


---------------
télétunestel ouimélétuness sitélétunes mélétunetron [:koulip31] [:suri]
n°165007
LetoII
Le dormeur doit se réveiller
Posté le 24-06-2002 à 21:38:10  profilanswer
 

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.


---------------
Le Tyran
n°166003
Musaran
Cerveaulté
Posté le 26-06-2002 à 02:10:04  profilanswer
 

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 !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°166004
Musaran
Cerveaulté
Posté le 26-06-2002 à 02:14:24  profilanswer
 

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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°166008
gilou
Modérateur
Modzilla
Posté le 26-06-2002 à 03:54:14  profilanswer
 

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+,


Message édité par gilou le 26-06-2002 à 03:56:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°167793
Musaran
Cerveaulté
Posté le 28-06-2002 à 00:56:38  profilanswer
 

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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°167853
darkoli
Le Petit Dinosaure Bleu
Posté le 28-06-2002 à 09:07:19  profilanswer
 

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)).


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°167896
gilou
Modérateur
Modzilla
Posté le 28-06-2002 à 10:24:40  profilanswer
 

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...
:D
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°167906
LetoII
Le dormeur doit se réveiller
Posté le 28-06-2002 à 10:37:17  profilanswer
 

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.


Message édité par LetoII le 02-07-2002 à 09:11:20

---------------
Le Tyran
n°168522
bailly33
vive James Hetfield!!!!!!!!
Posté le 30-06-2002 à 01:14:15  profilanswer
 

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.

n°169370
Musaran
Cerveaulté
Posté le 02-07-2002 à 00:36:51  profilanswer
 

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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°169408
darkoli
Le Petit Dinosaure Bleu
Posté le 02-07-2002 à 08:50:07  profilanswer
 

gilou a écrit a écrit :

 
J'aurais plutôt mis ça sur le compte des free, moi...
:D
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).


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C] Les structures ... tableaux .. le mien marche po ...

 

Sujets relatifs
[PHP] Boucle qui marche po... j'y comprends rien[PHP] Remplissage de tableaux
[PHP] mon top 10 ne marche pas[php] problème de tableaux!! à l'aide :'(
[C-C++] SendInput /keybd_event comment ça marche?Pourquoi cette requete ne marche paS?
[PHP] fonction EXEC marche pas pk ?HTML/Javascript : modifier la couleur d'un champ texte... MARCHE!
Envoi de formulaire par mail, comment ca marche ?[PHP] BOuhhhhh ya mon cookie qui marche pas .....
Plus de sujets relatifs à : [C] Les structures ... tableaux .. le mien marche po ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR