[C] Caster un int en void*

Caster un int en void* [C] - C - Programmation

Marsh Posté le 30-03-2004 à 22:35:38    

Je souhaite creer une liste. Jusque là, rien d'original, mais je souhaite que dans chaque cellule de ma liste il puisse y avoir aussi bien un entier qu'une chaine de caractère ou autre (oui je sais ca ressemble fortement à de l'objet  :D Mais j'ai besoin de le faire en C).
 
Bref chaque cellule prend un void * et un pointeur sur la cellule suivante.  
Et pour rentrer un entier dans une cellule, je le caste en void *.
Par exemple :  
int i = 5;
macellule->valeur = (void*)i;
 
Mais est ce un cast "valable" ? J'ai testé mon programme, ca compile, mais quand je rentre la suite d'entier 3 12 7 dans ma liste, celle ci affiche (134520856 ) au lieu de (3 7 12 )  :??:  
 
Le probleme viendrai il du cast ?  :sweat:  
 

Reply

Marsh Posté le 30-03-2004 à 22:35:38   

Reply

Marsh Posté le 30-03-2004 à 22:39:33    

pourri. dangereux, mauvais.
 
 
le truc, c'est de faire 1 enum qui donne le type de la donnée + union pour les données

Reply

Marsh Posté le 30-03-2004 à 22:53:21    

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. enum Type
  4.   {
  5.     INTEGER,
  6.     REAL,
  7.     STRING
  8.   };
  9. struct Var
  10. {
  11.   enum Type type;
  12.   union
  13.   {
  14.     int i;
  15.     double f;
  16.     char str[128];
  17.   } data;
  18. };
  19. void Var_init_with_integer(struct Var *v, int i)
  20. {
  21.   v->type   = INTEGER;
  22.   v->data.i = i;
  23. }
  24. void Var_init_with_real(struct Var *v, double f)
  25. {
  26.   v->type   = REAL;
  27.   v->data.f = f;
  28. }
  29. void Var_init_with_string(struct Var *v, const char *s)
  30. {
  31.   v->type   = STRING;
  32.   strncpy(v->data.str, s, sizeof v->data.str);
  33.   v->data.str[ sizeof v->data.str - 1 ] = '\0';
  34. }
  35. void Var_print(const struct Var *v)
  36. {
  37.   switch(v->type)
  38.     {
  39.     case INTEGER:
  40.       printf("Var %d\n", v->data.i);
  41.       break;
  42.     case REAL:
  43.       printf("Var %f\n", v->data.f);
  44.       break;
  45.     case STRING:
  46.       printf("Var %s\n", v->data.str);
  47.       break;
  48.    
  49.     default:
  50.       printf("Var UNKNOW\n" );
  51.      
  52.     }
  53. }
  54. int main()
  55. {
  56.   struct Var v;
  57.   Var_init_with_integer(&v, 42);
  58.   Var_print(&v);
  59.   Var_init_with_real(&v, 69.69);
  60.   Var_print(&v);
  61.   Var_init_with_string(&v, "TazForEver" );
  62.   Var_print(&v);
  63. }

Reply

Marsh Posté le 30-03-2004 à 22:53:31    

Taz a écrit :

pourri. dangereux, mauvais.
 
 
le truc, c'est de faire 1 enum qui donne le type de la donnée + union pour les données  


 
union pour les données .... tu veux dire que je dois connaitre d'avance tous les types que je peux inserer dans ma liste c'est ça ?
 
EDIT : Waou tu viens de le tapper à l'instant ? :D
Merci ca dvrait m'aider, je vais essayé de l'implémenter comme ça


Message édité par Slayne le 30-03-2004 à 22:55:13
Reply

Marsh Posté le 30-03-2004 à 22:55:24    

Slayne a écrit :


 
union pour les données .... tu veux dire que je dois connaitre d'avance tous les types que je peux inserer dans ma liste c'est ça ?  
 

oui, bien entendu. à moins que tu fasse une liste de void*, mais à ce moment, là c'est à l'utilisateur de tout gérer, c'est à dire de donner un pointeur vers sa donnée lors de l'ajout dans la liste, et plus tard quand il la demande, de récupérer un void* et de se souvenir de qu'il y avait vraiment derrière.
 
donc ça veut dire que tu aurais un truc du genre

Code :
  1. void list_append(List *, void *data);
  2. void *list_get_index(List*, int index);
  3. int *i = malloc(sizeof *i);
  4. list_append(l, i);
  5. int *j = (int*) list_get_index(l, 42);
  6. //travailler avec *j
  7. free(j);


[/cpp]


Message édité par Taz le 30-03-2004 à 22:57:42
Reply

Marsh Posté le 30-03-2004 à 22:58:10    

Slayne a écrit :


EDIT : Waou tu viens de le tapper à l'instant ? :D
Merci ca dvrait m'aider, je vais essayé de l'implémenter comme ça

oui est sans une seule erreur de compil du premier coup

Reply

Marsh Posté le 30-03-2004 à 23:05:19    

Taz a écrit :

oui est sans une seule erreur de compil du premier coup


 
Waou ... quand je serai grand je serai comme toi  :ouch:  
 
Ah bah zut je suis plus vieux que toi  :sweat: Tu programmes beaucoup ?

Reply

Marsh Posté le 30-03-2004 à 23:06:52    

pas tellement, je retiens juste les syntaxes, bibliothèques, normes, spécifications assez facilement ... mais avec un peu d'habitude, ça se fait naturellement

Reply

Marsh Posté le 31-03-2004 à 00:07:16    

Taz a écrit :

oui est sans une seule erreur de compil du premier coup


 
On ne va pas en dire autant pour le français  :whistle:  


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 31-03-2004 à 00:26:54    

c'est pas ma faute si le s est à côté du t :o

Reply

Marsh Posté le 31-03-2004 à 00:26:54   

Reply

Marsh Posté le 31-03-2004 à 06:30:14    

Taz a écrit :

c'est pas ma faute si le s est à côté du t :o


Ouais, on y croit tous!  :D

Reply

Marsh Posté le 31-03-2004 à 08:24:54    

Ace17 a écrit :


Ouais, on y croit tous!  :D  


 
Taz a un clavier azesty  :??:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed