Vous devriez donner les noms de vos structures.Par exemple,
struct foo {
char * str1;
float tt1;
};
Ensuite, vous pouvez déclarer vos instances comme ceci:
struct foo var1 = { "This is me", 12 };
Ensuite, vous pouvez lancer la void *
à un struct foo *
dans votre fonction:
void printStruct(void * ptr) {
printf("str=%s\n", ((struct foo *)ptr)->str1);
}
Et vous pouvez appeler comme ceci:
int main(...) {
struct foo var1 = { "This is me", 12 };
printStruct(&var1);
}
Mise à jour: Commenter Johannes avait raison, ma réponse ne tient pas compte du fait que l'affiche originale disait qu'il pourrait ne pas connaître le type de chaque structure. solution mise à jour est la suivante:
Puisque vous savez que tous vos struct contiennent un char * str1
, vous pouvez profiter de « modèle de mémoire plat » de C en jetant vos struct directement à struct générique, étiquette qui ne contient que char * str1
. Cela ne fonctionnera que si char * str1
est le premier élément des structures.
struct base { char * str1; };
struct { char * str1; float tt1; } var1 = { "This is me", 12 };
struct { char * str1, int tt2; } var2 = { "This is me", 18 };
void printStruct(void * ptr) {
printf("str is %s\n", ((struct base *)ptr)->str1);
}
Ceci est un hack assez sale, cependant, IMO. S'il y a d'autres membres que vous voulez partager, vous ne pourrez pas utiliser cette même astuce.
Une autre option consiste à définir une struct
qui utilise une union avec un recenseur de garder une trace de quel type est en fait utilisé dans l'union:
enum { FLOAT_TYPE, INT_TYPE };
struct foo {
char * str1;
union {
float tt1;
int tt2;
} numericValue;
int unionType;
};
Cela vous permettra de définir des variables comme ceci:
struct foo var1 = { .str1 = "This is me", .numericValue.tt1 =12, .unionType = FLOAT_TYPE };
struct foo var2 = { .str1 = "This is me", .numericValue.tt2 =18, .unionType = INT_TYPE };
vous n'avez pas besoin de gérer pour différents types de struct, vous pouvez lancer votre pointeur vide à la place struct foo *
:
void printStruct(void * ptr) {
struct foo * p = (struct foo *)ptr;
printf("string is %s\n", p->str1);
}
Cela pourrait nécessiter un peu plus de travail, mais c'est beaucoup plus propre, IMO.
L'avez-vous essayé? – John
Juste un petit conseil. Vous pourriez vouloir déclarer le char * à un const. Comme ceci: const char * str1. – ant2009