Comment changer une variable d’un type en une autre en C?

Je veux le faire:

int main () { bla bla bla void *onetype; switch (USER_INPUT_TYPE) { CASE CONVERT_TO_CHAR: convert onetype VOID TO CHAR >>> HOW??? CASE CONVERT_TO_INT: convert onetype VOID TO INT >>> HOW??? LOT OF CASES... } } 

Oui, je connais le transtypage, mais le transtypage est un changement “temporaire”.

Alors, y a-t-il un moyen de le faire en C?

MODIFIER :

Arrête arrête arrête! S’il vous plaît, voyez, qu’est-ce que vous faites est de type casting, je sais, vous créez une autre variable du type souhaitable comme int i = (int) onetype, je ne veux pas cela, je veux autre chose comme onetype = (int ) un type, sans les recréer, sans allouer une autre variable.

Merci beaucoup les gars!

Ce que vous voulez, ce sont des informations de type au moment de l’exécution – pour avoir une variable dans laquelle le type ne peut être déterminé qu’au moment de l’exécution. C n’a PAS cette fonctionnalité dans le langage – une fois le programme compilé, les types sont effacés et il n’existe que des blobs de mémoire. Les langages dynamics conservent les informations de type et les implémentent de manière native.

Vous pouvez concevoir votre propre système de marquage de type maison:

 typedef union { int i; char c; float f; } evil; typedef struct { evil value; int type; } tagged_t; enum { TYPE_INT, TYPE_CHAR, TYPE_FLOAT }; tagged_t bar; bar.value.c = 'a'; bar.type = TYPE_CHAR; 

Maintenant, chaque fois que vous souhaitez utiliser votre type tagged_t, vous devez implémenter une condition pour chaque type possible de variable que vous stockez, ou être en mesure de déterminer si un type est autorisé ou non dans cette zone de code.

Cela ressemble à votre scénario est comme suit

  • void* onetype contient un pointeur sur une variable fortement typée
  • USER_INPUT_TYPE vous indique le type de cette variable

Si c’est le cas, essayez ce qui suit.

 switch (USER_INPUT_TYPE) { case CONVERT_TO_CHAR: char c = *((char*)onetype); ... break; case CONVERT_TO_INT: int i = *((int*)onetype); ... break; } 
 int lolcakes = *(void*)onetype; 

Cela suppose que vous savez avec certitude que le type pointe vers un int. Utiliser ce type de casting est extrêmement dangereux.