toon Posté(e) le 12 décembre 2007 Partager Posté(e) le 12 décembre 2007 bonjour, j ai un projet à réaliser en c sur minix. j'aimerais bien savoir comment connaitre le type d'une structure. (un peu comme la methode instanceOf de java). voila la partie du code que je pense utilile : 00013 typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3;} mess_1; 00014 typedef struct {int m2i1, m2i2, m2i3; long m2l1, m2l2; char *m2p1;} mess_2; 00015 typedef struct {int m3i1, m3i2; char *m3p1; char m3ca1[M3_STRING];} mess_3; 00016 typedef struct {long m4l1, m4l2, m4l3, m4l4, m4l5;} mess_4; 00017 typedef struct {short m5c1, m5c2; int m5i1, m5i2; long m5l1, m5l2, m5l3;}mess_5; 00018 typedef struct {int m7i1, m7i2, m7i3, m7i4; char *m7p1, *m7p2;} mess_7; 00019 typedef struct {int m8i1, m8i2; char *m8p1, *m8p2, *m8p3, *m8p4;} mess_8; 00020 00021 typedef struct { 00022 int m_source; /* who sent the message */ 00023 int m_type; /* what kind of message is it */ 00024 union { 00025 mess_1 m_m1; 00026 mess_2 m_m2; 00027 mess_3 m_m3; 00028 mess_4 m_m4; 00029 mess_5 m_m5; 00030 mess_7 m_m7; 00031 mess_8 m_m8; 00032 } m_u; 00033 } message; ce que j'aimerais bien savoir si il s'agit d'un message de type 1 ou 2 .... a partir d'une variable message merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Barroud Posté(e) le 12 décembre 2007 Partager Posté(e) le 12 décembre 2007 Bonsoir, Le type du message est contenu dans la variable entiére m_type de la structure message. Du moins, c'est ce que j'ai compris de cette page : http://www.inf.fu-berlin.de/lehre/WS06/BS/...n/hinweis3.html (http://www.cis.syr.edu/~wedu/seed/Documentation/Minix3/How_to_add_system_call.pdf) Cordialement, Barroud. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 12 décembre 2007 Partager Posté(e) le 12 décembre 2007 yep, à ma connaissance, c'est le seul moyen de faire de l'introspection en C pur : encapsuler tes données dans une structure qui contient le type et une union de tout les types possibles. C'est lourdingue à souhait. Remarque, tu pourrais aussi jouer aux devinette en tatant du sizeof, cependant si jamais tu as deux structures avec la même taille, c'est foutu... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Barroud Posté(e) le 13 décembre 2007 Partager Posté(e) le 13 décembre 2007 :nonnon: Le sizeof sur une union rendra toujours la même valeur, celle de la structure la plus grande. J'y ai pensé aussi au début. Lien vers le commentaire Partager sur d’autres sites More sharing options...
toon Posté(e) le 13 décembre 2007 Auteur Partager Posté(e) le 13 décembre 2007 la donnée m_type ne contient pas le type de message propremment dit. C'est des raccourcis pour dire si est un message est pour le reseau, .... un peu compliqué à chercher le type propre pour chaque raccourci. du mien c'est ce que j'ai compris merci qd meme Lien vers le commentaire Partager sur d’autres sites More sharing options...
PiFou86 Posté(e) le 14 décembre 2007 Partager Posté(e) le 14 décembre 2007 Effectivement un sizeof n'aidera pas, car il prend la taille du type le plus grand. D'après la doc ci-dessus, je ne vois pas non plus comment faire pour récupérer le type (si m_type ne donne pas un identifiant de type). Cependant d'après le peu que j'ai lu, si j'ai bien compris, les fonctions qui utilise cette structure connaissent le type de message non ? Say a system-call handler do_managecap needs to receive three integer parameters. Thesystem-call number of do_managecap is 58. We need to initialize the three parameters in the message structure, and call the system call handler using the message structure as shown in figure 7. message m; m.m1_i1=45; m.m1_i2=55; m.m1_i3=65; _syscall(FS,58,&m); Figure 7: Passing Parameter Using the Message Structure Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.