[C/C++] Toujours les structures / Accès direct

Toujours les structures / Accès direct [C/C++] - C++ - Programmation

Marsh Posté le 17-02-2005 à 08:04:13    

admettons que nous ayons :

Code :
  1. struct repertoire
  2. {
  3.    short age;
  4.    long telephone;
  5.    short code_postal;
  6. };


 
Est-il possible d'accéder au champ 2 sans spécifier que celui ci s'appelle telephone ?
Ce que j'aimerais afficher c'est :
telephone : 025485254 ; sans spécifier le nom du champ
 
En somme je cherche surtout le moyen de d'accéder au nom d'un champ dans une structure, en connaissant sa place dans la structure de donnée

Reply

Marsh Posté le 17-02-2005 à 08:04:13   

Reply

Marsh Posté le 17-02-2005 à 08:27:12    

ben à partir du moment où tu le places dans une structure autant y accèder comme tel non?
Sinon tu peux faire une gruikerie via le préprocesseur  

Code :
  1. #define repertoire_struct.telephone TELEPHONE


En ayant pris soin de définir repertoire_struct comme de type struct repertoire


Message édité par manatane le 17-02-2005 à 08:29:03
Reply

Marsh Posté le 17-02-2005 à 09:57:46    

Mon problème est que les structures sont énormes et servent à rappatrier des données en masse venues de fichiers (parfois 400 champs dans ma structure)
L'objectif est de pouvoir détecter le nom du champ numéro 50 de ma structure par exemple
pour y accéder (syntaxe érronée bien sur, je ne la connais pas)
repertoire.[nom_champ[20]];
nom_champ n'étant pas un tableau mais une éventuelle fonction de la STL ou autre...
Si ca existe ca serait l'occasion de me faire gagner 100 ans de code

Reply

Marsh Posté le 17-02-2005 à 10:00:44    

400 champs dans une struct ? [:le kneu]
 
(cela dit j'ai pas compris ce que tu veux faire exactement, faudrait que tu decrives un peu mieux ton but)

Reply

Marsh Posté le 17-02-2005 à 10:08:53    

J'ai pas non plus trop compris le but de la manoeuvre mais à priori tu peux peut etre utiliser une table de hashage (hsearch, hcreate, hdestroy) ou les dbm si tu es sous Unix. Ca fonctionne sur le shemà cle unique/valeur ce qu'il me semble que tu cherches.


Message édité par manatane le 17-02-2005 à 10:09:25
Reply

Marsh Posté le 17-02-2005 à 10:10:43    

manatane > t'as pas plutot une hashmap C++ ?  (sous VS je sais que c'est stdext::hash_map (ils l'ont sorti de std pour des raisons de norme, je sais pas ce qu'il en est sous gcc))

Reply

Marsh Posté le 17-02-2005 à 10:23:51    

en fait çà dépend de la version de gcc : à partir de gcc 3.2
the include file hash_map of gcc 2.95.2 has become ext/hashmap On top of that, the type is no more std::hash_map but __gcc_cxx::hash_map. One way of dealing with that is to use hash_map (without a namespace) and do this for inclusion :

Code :
  1. #ifdef _WIN32
  2. #include "stl_hash.h"
  3. using std::hash_map;
  4. #else
  5. #if defined (__GNUC__) && ( __GNUC__ <= 2 )
  6. #include <hash_map>
  7. using std::hash_map;
  8. #else
  9. #include <ext/hash_map>
  10. using __gnu_cxx::hash_map;
  11. #endif
  12. #endif


Reply

Marsh Posté le 17-02-2005 à 10:25:16    

__gnu_cxx  
 
zaurais pu trouver un peu plus sesksy quand meme [:petrus75]

Reply

Marsh Posté le 17-02-2005 à 10:30:22    

Les mecs de gcc savent rire http://www.djmnet.org/humor/gcc-pragma.txt  
:D

Reply

Marsh Posté le 17-02-2005 à 11:09:02    

J'explique, le domaine est un peu "très pointu" donc je ne peux pas aller dans les détails :
Je recois des messages et j'en envoie, ces messages ont une structure très particulière (des short, des long, des float etc)
J'ai créé la dizaine de strucutres types pour les envois/receptions de messages
J'aimerais faire des affichages écran ou dans un fichier texte sans m'embeter à faire genre  
cout << "Champ Adresse" << mastruct.Adresse;
Je voudrais pouvoir faire :
cout << "Champ " << mastruct.[Champ(1)] << " : " << mastruct.(mastruct.[Champ(1)]) << "endl";
Champ() étant la fonction que je cherche (si elle existe ou si elle est codable)
 
Voila ! je me suis peut etre mieux fait comprendre ;)

Reply

Marsh Posté le 17-02-2005 à 11:09:02   

Reply

Marsh Posté le 17-02-2005 à 11:24:31    

J'ai pas tout compris sur le pourquoi tu veux faire ça (et pas utiliser bêtement une simple map).  
Mais je pense que tu devrais regarder du côté des pointers to data members.
http://www.icce.rug.nl/documents/c [...] lus15.html

Reply

Marsh Posté le 17-02-2005 à 11:31:04    

bin ca l'aidera pas, si je comprends bien il aimerait aussi avoir le nom du champ gratuitement

Reply

Marsh Posté le 17-02-2005 à 11:34:36    

Bah, tu utilises une vielle macro moisie, qui te pond à la fois le symbole et son nom...
Genre:

Code :
  1. #ifdef I_AM_IN_THE_CPP
  2. #define DEFIELD(x,y) const x * y = Add(#x,#y);
  3. #else
  4. #define DEFIELD(x,y) extern const x* y;
  5. #endif
  6. DEFIELD(short,chrisbk)
  7. DEFIELD(long,bite)


Message édité par Lam's le 17-02-2005 à 11:34:56
Reply

Marsh Posté le 17-02-2005 à 13:03:49    

plus simple éventuellement :
 
Est il possible de créer une structure, avec pour noms de champ des variables ? ou éventuellement des const char * ou const string ?
 
La syntaxe est encore fausse :
 

Code :
  1. cons string champ[3] {"Age", "Taille", "Sexe"};
  2. struct MaStruct
  3. {
  4.     long champ[0];
  5.     short champ[1];
  6.     char champ[2];
  7. };


 
je n'ai pas le compilo sur le PC ou j'ai internet, donc je ne peux pas tester ! Ca fonctionne ce genre de choses ? Ou alors y a-t-il une syntaxe différente permettant de donner des noms de champs appartenant à une variable ?


Message édité par kowalski le 17-02-2005 à 13:04:27
Reply

Marsh Posté le 17-02-2005 à 13:51:26    

[:heink]
Et si tu essayé de faire les choses simplement et de façon propre?
Parce que tout ce tintamare pour un truc aussi con que çà c'est un peu bete. Celà je ne suis toujours pas sur d'avoir compris ce que tu veux faire...  

Code :
  1. #include <stdio.h>
  2. typedef struct Machin_{
  3.   const char coin[ 20 ];
  4.   const char prout[ 20 ];
  5.   const char plop[ 20 ];
  6. }Machin;
  7. int main( void ){
  8.   Machin truc = { "gruik", "burp", "zob", };
  9.  
  10.   fprintf( stdout, "%s\n %s\n %s\n", truc.coin, truc.prout, truc.plop ); // affiche les chaines
  11.   truc.coin = "toto"; // erreur truc.coin est en lecture seule
  12.   return 0;
  13. }


Et puis essaie de connaitre le C avant de faire du C++.

Reply

Marsh Posté le 17-02-2005 à 14:01:18    

Tu essaies de m'expliquer quoi là ?
Je sais bien déclarer une structure, mon problème est que j'aimerais par une méthode C ou C++, que les noms des champs de ma structures soient données par une autre variable.
Si ce n'est pas possible, tu me le dis et tu ne m'envoie pas des petites phrases assassines ridicules car ce que tu as écrit, je le sais très bien...
 
Tintamarre pour un truc aussi con : Tu es bien gentil, mais mes structures ce ne sont pas des structures à 3 champs avec toto & co. Ce sont une dizaine de structure avec parfois des 100aines de champs. Je les utilises car j'ai besoin de faire de la lecture/écriture en bloc.
 
J'ai été poli pdt tout le topic que je sache

Reply

Marsh Posté le 17-02-2005 à 14:11:53    

kowalski a écrit :

Tu essaies de m'expliquer quoi là ?
Je sais bien déclarer une structure


Citation :

Est il possible de créer une structure, avec pour noms de champ des variables ? ou éventuellement des const char * ou const string ?
...
Si ce n'est pas possible, tu me le dis et tu ne m'envoie pas des petites phrases assassines ridicules car ce que tu as écrit, je le sais très bien...


[:moule_bite]

Citation :

Tu es bien gentil, mais mes structures ce ne sont pas des structures à 3 champs avec toto & co. Ce sont une dizaine de structure avec parfois des 100aines de champs. Je les utilises car j'ai besoin de faire de la lecture/écriture en bloc.


A ben ouais évidemment...

Citation :

J'ai été poli pdt tout le topic que je sache


Ben heureusement et moi aussi j'étais poli.

Reply

Marsh Posté le 17-02-2005 à 14:19:23    

Je n'insiste pas, amuse toi bien cette après midi, moi j'ai du travail.
Si tu n'as pas compris ce que je demandais (même si je ne m'exprime pas selon la norme ANSI/ISO), et bien tant pis pour moi.
 
Je veux SOIT récuperer le NOM d'un champ en spécifiant sa POSITION, et pas sa VALEUR.
SOIT créer une structure dont les NOMS des champs sont nommés par des VARIABLES.
Pour ensuite faire : Mastructure.MesChamps[5] Pour accéder au 5e champ de ma structure. (Bien que ce ne soit pas possible selon cette syntaxe, voilà pourquoi je suis là, en train de vous demander une solution)
 
Si je trouve mon bonheur je mettrais la réponse ici
Merci chrisbk.

Reply

Marsh Posté le 17-02-2005 à 14:28:04    

kowalski a écrit :


Je veux SOIT récuperer le NOM d'un champ en spécifiant sa POSITION, et pas sa VALEUR.


 
pas trop possible, voir meme je vois pas trop, au débotté. Je fricotte jamais avec des structs de 200membres, ca depasse rarement la dizaine (au dela c'est que generalement j'ai merdé qqpart)
 
 

kowalski a écrit :


SOIT créer une structure dont les NOMS des champs sont nommés par des VARIABLES.


bin pour ca t'as la solution table de hachage.
Genre (en c++, vu que t'as mis ton topic en cat c++)
 
matabledehachage["roger"] = 15;
matabledehachage["simone"] = 22;
pomme = matabledehachage["pack de kro"]
 
par contre, ca te dezingue ton ecriture en bloc (mais bon, tu peux t'y retrouver en faisant une iteration sur ta table de hachage) et une table de hachage ne peut contenir qu'un type (soit int, soit float, soit une structure mais pas un mélange)
 
evidemment, tu peux bricoler un truc genre  
 

Code :
  1. enum Type {
  2. TYPE_FLOAT, TYPE_INT, TYPE_....
  3. };
  4. struct Valeur {
  5. union {
  6.    float fVal;
  7.    int   iVal;
  8.    short sVal;
  9.    ...
  10. }
  11. Type type; //decrit quel membre il faut utiliser (fVal, iVal...)
  12. }


 
et stocker des "Valeurs" dans ta tdh. Mais jtrouve pas que ca casse des briques. (vu que t'es en c++ tu peux planquer tout ca dans une classe, et planquer un brin le tout avec une surcharge d'operateur, mais bon, idem)
 
(ou alors faire plusieurs tds, stockée dans une struct, une par type)
 
 
 
 
 

Reply

Marsh Posté le 17-02-2005 à 14:37:25    

Merci beaucoup, mais effectivement (pour le 2e cas que tu as explicité) je pense que je préfère faire une écriture/lecture en bloc qu'un accès aux champs.
La chose c'est que je ne peux pas réduire mes structures, elles sont données par un fabricant, et bien sur celui ci n'a pas mis dans l'ordre float avec float, short avec short etc... Tout est mêlé à l'intérieur ce qui fait des structs immenses...
Accéder au nom du champ a l'air impossible mais ca m'aurait permis de gagner un nombre de ligne incroyable et surtout de permettre aux gens qui reprendront le code de mettre à jour facilement sans avoir à modifier l'IHM du prog...
 
Je vais tenter de faire le truc le plus propre possible avec des struct, ca m'emmerde mais c'est comme ca...
 
Question subsidiaire. Imaginons que je crée en parallèle une map avec un #id et "les noms de champs"
 
Je fais une structure déclarée normalement (donc avec les noms des champs explicités) mais lors de l'appel des champs, j'utilise ma map, du genre :
 
MaStructure.Mamap<21>
Avec Mamap<21> qui contient le nom du champ !
 
Bon j'espère que je n'insiste pas trop avec ca...

Reply

Marsh Posté le 17-02-2005 à 18:29:36    

Mon problème je pense est que j'ai de bonnes notions de quelques langages mais que je ne suis expert dans aucun...
 
En PHP, je peux appeller une variable comme cela :
 
 $["mavariable_$compteur"] lorsque $compteur est à 20, ca accède à $mavariable_20.
Existe-t-il en C ou C++ un opérateur proche de [] en PHP ? ca pourrait résoudre mon probleme

Reply

Marsh Posté le 17-02-2005 à 18:40:24    

bin une hashmap int -> truc
le pb c'est que le C/C++ sont fortement (pas de dialogue d'expert la dessus plz) donc fo connaitre a l'avance 'truc' precisemment


Message édité par chrisbk le 17-02-2005 à 18:40:45
Reply

Marsh Posté le 17-02-2005 à 18:48:35    

Oui, mais avec une map je ne pense pas pouvoir accéder à un champ d'une structure... Enfin en tourne en rond :'(
 
Merci de ton aide, et si tu as un éclair de génie... !

Reply

Marsh Posté le 17-02-2005 à 19:12:11    

kowalski a écrit :

Oui, mais avec une map je ne pense pas pouvoir accéder à un champ d'une structure... Enfin en tourne en rond :'(
 
Merci de ton aide, et si tu as un éclair de génie... !


 

kowalski a écrit :

Oui, mais avec une map je ne pense pas pouvoir accéder à un champ d'une structure... Enfin en tourne en rond :'(
 
Merci de ton aide, et si tu as un éclair de génie... !


 
Pourquoi ne pas utiliser une "union", avec un truc style

Code :
  1. union {
  2.    struct {
  3.       short age;
  4.       long telephone;
  5.       short code_postal;
  6.    } variable;
  7.    struct {
  8.       short zone1;
  9.       long zone2;
  10.       short zone3;
  11.    } champ;
  12. } grosTruc;


 
Evidemment c'est un peu tordu mais je vois que ça...

Reply

Marsh Posté le 17-02-2005 à 19:48:22    

C'est tordu certes, mais c'est pas mal !
Lors de la lecture, je peux utiliser un compteur pour incrémenter zone à ton avis et éviter d'écrire  
grosTruc.zone1
grosTruc.zone2
grosTruc.zone3 ?
 
Si oui, c'est la solution j'imagine ;)

Reply

Marsh Posté le 17-02-2005 à 22:22:49    

kowalski a écrit :

C'est tordu certes, mais c'est pas mal !
Lors de la lecture, je peux utiliser un compteur pour incrémenter zone à ton avis et éviter d'écrire  
grosTruc.zone1
grosTruc.zone2
grosTruc.zone3 ?
 
Si oui, c'est la solution j'imagine ;)


 
Déjà, c'est pas "grosTruc.zone1" mais "grosTruc.champ.zone1".
 
En fait, (et contrairement à tous les autres qui ont répondu un peu au pif) je comprends ton problème. Tu as une structure tellement énorme que tu dois traiter champ par champ (probablement l'afficher) et ça te fait chier de coder 4000 "printf" pour les 4000 champs de ta structure. Donc tu aimerais faire un "for (i=0; i < 4000; i++)" et juste faire "grosTruc.champ.zone[i] >> cout" (où un truc analogue)
 
Désolé, je trouve pas. Si les champs ne sont pas identique, je crois pas cela possible. J'essaye d'imaginer un pointeur qui irait de champ en champ mais avec des champs de taille différente, (et peut-être même mélange joyeux de char[] avec des double) jtrouve pas l'idée géniale. Désolé...
 
Peut-être faut revoir ta conception. Pourquoi faire tant de champ si le traitement doit être analogue pour chacun ? Pourquoi pas un gros tableau de choses identiques à la place ? En fait j'ai jamais eu ce problème.
 
Autre solution: Créer un générateur de script qui analyse ta structure et génère les 4000 "cout". Puis tu insères ces lignes dasn ton source.
 
Encore désolé...

Reply

Marsh Posté le 17-02-2005 à 22:27:05    

Ce n'est pas à toi de t'excuser !
Merci en tous cas pour ta contribution
Je me disais que le préprocesseur avait quelques fonctions permettant de naviguer dans les structures... :'(
Pour la conception, comme expliqué, je n'ai pas trop le choix, c'est un choix constructure, je dois piloter du matériel...
 
bref, je crois que je vais me tapper du cout (et pas seulement d'ailleurs) :'(
 
Vais passer ma nuit sur msdn...
 
Bonne nuit

Reply

Marsh Posté le 18-02-2005 à 11:10:57    

kowalski a écrit :

Ce n'est pas à toi de t'excuser !
Merci en tous cas pour ta contribution
Je me disais que le préprocesseur avait quelques fonctions permettant de naviguer dans les structures... :'(
Pour la conception, comme expliqué, je n'ai pas trop le choix, c'est un choix constructure, je dois piloter du matériel...
 
bref, je crois que je vais me tapper du cout (et pas seulement d'ailleurs) :'(
 
Vais passer ma nuit sur msdn...
 
Bonne nuit


 
J'ai trouvé un truc qui peut t'aider
1) j'ai imaginé une fonction qui affiche chaque champ (une fonction par champ) et un tableau de fonctions qui stocke toutes les fonctions nommées
Voilà ce que ça donne (écrit en norme C paske suis pas assez calé en C++ pour le faire en C++)

Code :
  1. #include <stdio.h>
  2. // Structure de test
  3. typedef struct {
  4. int age;
  5. double freq;
  6. char nom[100];
  7. } t_personne;
  8. // Fonctions qui affichent chaque champ
  9. void affich1(t_personne *p)
  10. {
  11. printf("%d\n", p->age);
  12. }
  13. void affich2(t_personne *p)
  14. {
  15. printf("%f\n", p->freq);
  16. }
  17. void affich3(t_personne *p)
  18. {
  19. printf("%s\n", p->nom);
  20. }
  21. // Pgm de test
  22. main()
  23. {
  24. // Tableau de stockage des fonctions
  25. static void (*tabAffich[])(t_personne*)={
  26.  affich1,
  27.  affich2,
  28.  affich3,
  29.  NULL};
  30. // Ptr de balayge pour le tableau de stockage des fonctions
  31. void (**ptAffich)(t_personne*);
  32. // Structure de test
  33. static t_personne P={12, 2.718, "Fred"};
  34. // Boucle d'affichage
  35. for (ptAffich=tabAffich;*ptAffich != NULL; ptAffich++)
  36.  (**ptAffich)(&P);
  37. // Si tu veux juste afficher le champ "3", alors tu écris  
  38. // (*tabAffich[2])(&P);
  39. }


 
Ensuite, je me suis dit que ton traitement n'est pas forcément un bête affichage et je me suis donc demandé si je pouvais pas juste récupérer la valeur de chaque champ en laissant le traitement de coté.
Donc il me fallait faire une fonction qui renvoie chaque champ. Là, j'avais un problème parce que les champs sont de type différents. Alors j'ai pensé à renvoyer un pointeur sur le champ plutôt que la valeur du champ lui-même. Sauf que le pointeur que tu récupères faut ensuite que tu saches ce que c'est pour savoir comment t'en servir. Alors j'ai pensé à associer à chaque fonction un flag indiquant le type de pointeur renvoyé.
Voilà le résultat:

Code :
  1. #include <stdio.h>
  2. // Structure de test
  3. typedef struct {
  4. int age;
  5. double freq;
  6. char nom[100];
  7. } t_personne;
  8. // Fonctions de récupération de chaque membre
  9. // Chaque fonction doit renvoyer la même chose donc
  10. // elle renvoie un pointeur universel "void*"
  11. void *get1(t_personne *p)
  12. {
  13. return((void*)&p->age);
  14. }
  15. void *get2(t_personne *p)
  16. {
  17. return((void*)&p->freq);
  18. }
  19. void *get3(t_personne *p)
  20. {
  21. return((void*)p->nom);
  22. }
  23. // Macrodéf pour les flags
  24. #define T_CHAR  (0x01)
  25. #define T_INT  (0x02)
  26. #define T_DBL  (0x03)
  27. #define T_STR  (0x04)
  28. // Structure pour gérer un traitement multiple
  29. // Cette structure contiendra un pointeur de fonction et un flag
  30. // pour décrire ce que récupère la fonction pointée
  31. typedef struct {
  32.    void* (*pF)(t_personne*); // Fonction qui traite
  33.    char flag;   // Flag de description
  34. }t_trt;
  35. main()
  36. {
  37.    // Tableau qui stocke tous les traitements
  38.    static t_trt tabTrt[]={
  39.       {get1, T_INT}, // La fonction "get1" traite un "int"
  40.       {get2, T_DBL}, // La fonction "get2" traite un "double"
  41.       {get3, T_STR}, // La fonction "get3" traite un "string"
  42.       {NULL}
  43.    };
  44.    // Ptr de balayge tableau des traitements
  45.    t_trt *ptTrt;
  46.    // Structure de test
  47.    static t_personne P={12, 2.718, "Fred"};
  48.    // Balayage de chaque fonction
  49.    for (ptTrt=tabTrt;ptTrt->flag != 0; ptTrt++)
  50.    {
  51.       // Evaluation du flag
  52.       switch (ptTrt->flag)
  53.       {
  54.          case T_CHAR: // On traite un char
  55.             printf("%c\n", *((char*)((*ptTrt->pF)(&P))));
  56.             // Ou bien "char c=(*((char*)((*ptTrt->pF)(&P))));
  57.             break;
  58.          case T_INT: // On traite un int
  59.             printf("%d\n", *((int*)((*ptTrt->pF)(&P))));
  60.             // Ou bien "int i=(*((int*)((*ptTrt->pF)(&P))));
  61.             break;
  62.          case T_DBL: // On traite un double
  63.             printf("%f\n", *((double*)((*ptTrt->pF)(&P))));
  64.             // Ou bien "double d=(*((double*)((*ptTrt->pF)(&P))));
  65.             break;
  66.          case T_STR: // On traite un string
  67.             printf("%s\n", (char*)((*ptTrt->pF)(&P)));
  68.             // Ou bien "char *s=((char*)((*ptTrt->pF)(&P));
  69.             break;
  70.       }
  71.    }
  72.    // Si tu veux juste traiter le champ "3", alors tu écris  
  73.    // switch (tabTrt[2]->flag)
  74.    // case ...
  75.    // <type> var=(*((<type*> )((tabTrt[2]->pF)(&P))));
  76. }


 
Ca fonctionne... mais ça devient "usine à gaz". Déjà rien que pour relire les parenthèses (qui sont toutes obligatoires du fait des priorités) tu te prends la tête. T'as vâchement intérêt à mettre beaucoup de commentaires parce que dans 6 mois, si tu reviens sur ton pgm; ben tu te tireras une balle !!!
 
A+


Message édité par Sve@r le 18-02-2005 à 11:16:55
Reply

Marsh Posté le 18-02-2005 à 11:17:44    

LOOOL ! Tu viens de lire mon PM ? c'est en gros ce que je tente de faire, sauf que ca me parait moins lourd de mon coté avec mes 2 maps
 
Je compare et je vous tiens au courant !

Reply

Marsh Posté le 18-02-2005 à 11:18:44    

Ah non en fait c'est pas vraiment pareil, je n'ai pas une fonction par champ de mon coté avec mon arithmétique de pointeurs je peux également modifier les valeurs...
 
Tu penses que quelle solution est la plus viable et / ou maintenable ?

Reply

Marsh Posté le 18-02-2005 à 11:27:27    

kowalski a écrit :

Ah non en fait c'est pas vraiment pareil, je n'ai pas une fonction par champ de mon coté avec mon arithmétique de pointeurs je peux également modifier les valeurs...
 
Tu penses que quelle solution est la plus viable et / ou maintenable ?


 
Hum... j'ai pas pensé à "comment modifier les valeurs".
 
A mon avis, ta solution est la meilleure puisque de mon coté, avec 4000 champs je dois coder 4000 "get...".
 
J'avais aussi envisagé l'arithmétique des pointeurs mais je voyais pas trop comment imaginer le truc. Poste donc ton code que je regarde comment tu as fais ???
 
 

Reply

Marsh Posté le 18-02-2005 à 11:32:05    

Je poste d'ici 1h éventuellement because là, j'ai encore qq étonnements sur la place mémoire des données dans ma struct, j'ai l'impression que même si j'ai qqch de 16b, il décalle de 32 pour le champ suivant, c'est étrange...
 
Je poste dans l'aprem

Reply

Marsh Posté le 18-02-2005 à 11:35:42    

kowalski a écrit :

Je poste d'ici 1h éventuellement because là, j'ai encore qq étonnements sur la place mémoire des données dans ma struct, j'ai l'impression que même si j'ai qqch de 16b, il décalle de 32 pour le champ suivant, c'est étrange...
 
Je poste dans l'aprem


 
 
nonon c'est pas etonnant, il aligne les données, j'avais fait un pety cours la dessus, attends vouar

Reply

Marsh Posté le 18-02-2005 à 11:36:45    

kowalski a écrit :

Je poste d'ici 1h éventuellement because là, j'ai encore qq étonnements sur la place mémoire des données dans ma struct, j'ai l'impression que même si j'ai qqch de 16b, il décalle de 32 pour le champ suivant, c'est étrange...
 
Je poste dans l'aprem


 
Il est possible que ton optimiseur de code s'arrange pour que la taille de ta structure fasse pile poil un nombre puissance de 2. En effet, le C arrive vâchement mieux à gérer les structures qui ont une taille égale à une puissance de 2...
A+

Reply

Marsh Posté le 18-02-2005 à 11:38:23    

Il n'y aurait pas qqch à décocher pour éviter ca ?
 
Par exemple j'ai un short entouré par des long
 le short prend 32 bits !
ensuie j'ai plusieurs short à la suite
 le short prend 16 bits...
 
C'est étrange non ?

Reply

Marsh Posté le 18-02-2005 à 11:38:55    

vala j'avais ecrit ca pour un pro du fortran [:god]
 
Si tu veux acceder rapidement a une donnée de 8octets, par exemple, ca va plus vite si son adresse%8 = 0. (ceci est un fait)
Pour celle de 4 octets, c'est %4
logique.
Bon, prenons une structure, avec des membres, genre
 

Code :
  1. struct machin {
  2.    int monInt;
  3.    double monDouble; //(double = 8octets)
  4.    char monChar;
  5. };


 
la comme j'ai fait, c'est mal, parce que si le compilo aligne monInt sur une adresse %4, il sera obligé de foutre 4octets de padding apres monInt pour que monDouble soit aligné sur une %8. C'est con.
alors que si j'avais fait :
 
 

Code :
  1. struct machin {
  2.    double monDouble;
  3.    int monInt;
  4.    char monChar;
  5. };


 
bin la ca aurait été bon. Il aligne monDouble sur une %8, monInt est forcement bien aligné(vu que si truc%8=0 alors (truc+8)%4=0, n'est ce pas ?), et monChar pareil. On apelle ca l'alignement naturel.
 
Bref, dans une struct, faut tjs mettre les plus grand membre devant, apres les petits, etc etc...
 
et donc a priori ton compilo aligne pour toi

Reply

Marsh Posté le 18-02-2005 à 11:43:27    

En québécois je dirais : osti de cibouère de Caliss !
 
Bon, ca ne m'arrange vraiment pas tout ca. Mon compilateur actuel ne sera pas mon compilateur que j'utiliserais à la fin (ma boite m'a pas encore filé VS, j'utilise DEvC++ en attendant)
Si ce genre de chose sont désactivables sous VS, je mets ca de coté et je fais autre chose...  
 
Par exemple chez moi :
long 32b
short 32b
long 32b
long 32b
short 16b
short 16b
short 16b
short 16b
 
C'est stressant parce que ma logique fonctionnait :/

Reply

Marsh Posté le 18-02-2005 à 11:45:09    

Je comprends tout à fait que les accès mémoires sont facilités, mais je ne cherche pas la perfo là ;) mais la simplicité de code
 
Sinon, je ne peux évidemment pas changer l'allure de mes struct (sinon ca fait longtemps que ce serait fait ;))

Reply

Marsh Posté le 18-02-2005 à 11:47:38    

c'est desactivable en fonction du compilo, genre
 
#pragma pack(1)
typedef struct {
...
}
#pragma pack()
 
mais ca implique de recompiler TOUT ce qui utilise cette struct

Reply

Marsh Posté le 18-02-2005 à 11:52:59    

Bon eh bien je ne sais pas quoi vous dire
 
Merci serait approprié...
Je vous tiens au courant et je posterais une version standard tu code

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed