Salut,
Alors voila, il était une fois ....
......et ceci amenant cela, je fus rapidement confronté a un problème de programmation en C.
...
Donc, je ne comprend pas comment marche les casts sur les structures. J'ai vu un exemple sur le net de programmation générique, ou la personne recherche à passer une structure générique à une fonction, pour une application client-serveur á développer contenant une centaine de formats de trames différentes.
http://www.developpez.net/forums/s [...] p?t=345137
Je met le code ici pour que ce soit plus clair :
Code :
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- typedef struct Frame {
- void (*send_data)();
- } Frame_s;
- typedef struct GenericFrame {
- Frame_s frame;
- } GenericFrame_s;
- typedef struct FrameA {
- Frame_s frame;
- int n;
- } FrameA_s;
- typedef struct FrameB {
- Frame_s frame;
- char str[20];
- } FrameB_s;
- typedef struct FrameC {
- Frame_s frame;
- double f;
- } FrameC_s;
- void sendDataFrameA(FrameA_s * frame) {
- printf("I send the frame A with n=%d\n", frame->n);
- }
- void sendDataFrameB(FrameB_s * frame) {
- printf("I send the frame B with string:%s\n", frame->str);
- }
- void sendDataFrameC(FrameC_s * frame) {
- printf("I send the frame C with f=%lf\n", frame->f);
- }
- int main(void) {
- GenericFrame_s * frames[3];
- FrameA_s * fA = NULL;
- FrameB_s * fB = NULL;
- FrameC_s * fC = NULL;
- int i;
- /* TODO : Verifier allocations*/
- fA = malloc(sizeof(*fA));
- fB = malloc(sizeof(*fA));
- fC = malloc(sizeof(*fA));
- fA->frame.send_data = sendDataFrameA;
- fA->n = 51;
- fB->frame.send_data = sendDataFrameB;
- strcpy(fB->str, "hello" );
- fC->frame.send_data = sendDataFrameC;
- fC->f = 13.2;
- frames[0] = (GenericFrame_s*)fA;
- frames[1] = (GenericFrame_s*)fB;
- frames[2] = (GenericFrame_s*)fC;
- for(i=0; i<3; ++i) {
- frames[i]->frame.send_data(frames[i]);
- }
-
- free(fA);
- free(fB);
- free(fC);
- return 0;
- }
|
Je comprend ce que fais le programme mais pas vraiment le concept, notamment les casts :
Code :
- frames[0] = (GenericFrame_s*)fA;
- frames[1] = (GenericFrame_s*)fB;
- frames[2] = (GenericFrame_s*)fC;
|
alors que les structures ne sont pas les mêmes. Quelqu'un pourrait-il m'expliquer comment marches les cast avec des structures, est ce risqué ou est ce normal ??? Est ce que cette démarche est valide.
Je ne comprend pas bien non plus le :
Code :
- frames[i]->frame.send_data(frames[i]);
|
on envoi a la structure sa structure ?
merci par avance