Pointeur sur structure variable

HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 26 nov. 2008 à 12:15
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 27 nov. 2008 à 20:14
Bonjour,

J'ai un code qui ressemble au suivant:

typedef struct _STRUCT1 {
    DWORD dwData1;
    DWORD dwData2;
    DWORD dwData3;
} STRUCT1, *LPSTRUCT1;

typedef struct _STRUCT2 {
    DWORD dwData1;
    DWORD dwData2;
    DWORD dwData4;
    DWORD dwData5;
    DWORD dwData3;
} STRUCT2, *LPSTRUCT2;

void funct(PVOID pStruct, DWORD dwMask)
{
    LPSTRUCT1 lps1;
    LPSTRUCT2 lps2;

    switch (dwMask)
    {
        case 1:
            lps1 = (LPSTRUCT1)pStruct;
            if (lps1->dwData3 == 2)
            {
                //traitement;
            }
            break;

        case 2:
            lps2 = (LPSTRUCT2)pStruct;
            if (lps2->dwData3 == 2)
            {
                //traitement;
            }
            break;
    }
}

Y a t-il moyen de simplifier ce code avec quelque chose comme ça :

void funct(PVOID pStruct, DWORD dwMask)
{
    PVOID pStructure;

    switch (dwMask)
    {
        case 1:
            pStructure = (LPSTRUCT1)pStruct;
            break;

        case 2:
            pStructure = (LPSTRUCT2)pStruct;
            break;
    }

    if (pStructure->dwData3 == 2)
    {
        //traitement;
    }
}

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
27 nov. 2008 à 12:19
Salut,

Bin sans mettre dwData3 au même offset dans les deux structures, je ne vois pas comment ce serait possible. Un genre d'héritage quoi, mais je suppose que tu connais la méthode.

Dans le cas suivant CHILD1 et CHILD2 ont toutes les deux la données intéressante (dwData3, mais en fait le nom n'a aucune importance) au même offset, c'est à dire 8 octets après leur adresse (Attention à l'alignement dans le cas de champs avec des types hétérogènes comme ici).

On peut donc accèder à ce membre en castant les strucutres en PARENT, peut importe que ce soit des CHILD1 ou des CHILD2 en mémoire.

C'est un mécanisme similaire qui est très souvent utilisé en prog orientée objet : les classes filles ont les membres de leurs parentes suivis de ses propres membres.
<hr size="2" width="100%" />typedef struct _CHILD1 {
    DWORD dwData1;
    DWORD dwData2;
    DWORD dwData3;
} CHILD1, *LPCHILD1;

typedef struct _CHILD2 {
    WORD wData1;

    WORD wData2;

    DWORD dwData4;

    DWORD dwData3;
} CHILD2, *LPCHILD2;

typedef struct _PARENT{

    char cReserved[8];


    DWORD dwData3;

} PARENT, *LPPARENT;
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
27 nov. 2008 à 20:14
Salut rt15,

Merci beaucoup pour ta réponse. Cette solution aurait été parfaite mais malheureusement les données qui m'intéressent sont à des offsets différents. Je crois que je n'aurais pas d'autre choix que de dupliquer le code pour chaque structure.

++
0
Rejoignez-nous