-1
votes

Comment stocker un double dans un vide * en C

J'ai trouvé conversion du double en annulation * en C mais je ne peux pas obtenir aucune des solutions à courir. Je souhaite créer une structure avec un pointeur vide pour stocker différents types de données.

printf("%d %f", t.id, t.val);


2 commentaires

Vous NE PAS Stockez un double dans un vide * . Vous pouvez cependant stocker un pointeur sur double , aka a double * dans un objet de type vide * .


Vous pouvez définir t.val = & d; ou t.val = pd; sur point t.val au double . Remarque, il convient à convertir un double * à un vide * , ne pas stocker un double dans un vide * comme Votre titre de question implique. Soyez prudent de vous assurer que le pointeur désigne toujours quelque chose de valide lorsque vous y accédez. Pour accéder au Double , convertir t.val retour à un double * et la désarférence. Par exemple. Changer printf ("% d% f", t.id, t.val); à printf ("% d% f", t.id, * (double *) t. val); .


3 Réponses :


0
votes

La taille d'un double est de 64 bits, tandis qu'un pointeur vide est de 32 bits sur un programme 32 bits et 64 bits dans un programme 64 bits.

Donc, vous pouvez le faire dans un exécutable 64 bits mais pas en un 32 bits.

Si vous souhaitez stocker différents types de données dans une structure comme celle-ci, vous pouvez utiliser un syndicat contenant chacun de vos types de données. Voir https://www.TutorialSpoint.com/cprogramming/c_unions.htm .


0 commentaires

1
votes

Pour imprimer la valeur Essayez xxx

t.val est un pointeur, pas la valeur elle-même, mais comme il s'agit d'un vide * Vous ne pouvez pas la désarférement sans une forme au type correct, qui est (double *) dans votre exemple simple.

Pour stocker les données dont vous n'avez pas besoin les trois pointeurs. Vous pouvez simplement affecter l'adresse: xxx

Il y a deux problèmes possibles avec cette approche.

  • Si vous voulez "stocker différents types de données", vous devez savoir quel type est stocké dans votre table struct lorsque vous souhaitez utiliser (imprimer) la valeur, comme vous l'avez utiliser la coulée corrente. (Peut-être avez-vous besoin d'un type supplémentaire dans votre structure.)

  • Si vous utilisez une variable avec un stockage automatique ou statique (comme double d = 2,5; dans l'exemple) et stockez son adresse dans t.val vous Doit être sûr que la variable ne soit pas invalide et que vous ne modifiez pas sa valeur plus tard. (Peut-être avez-vous besoin d'une allocation de mémoire dynamique pour créer une copie de la variable.)


0 commentaires

2
votes

Plusieurs points:

  1. Vous n'avez pas besoin de l'intermédiaire PD code> pour attribuer l'adresse de d code> à t.val code>. Ce qui suit devrait fonctionner parfaitement bien:
    struct Table {
      int id;
      int valueType;
      void *val;
    };
    
    void assignDblVal( struct Table *tbl )
    {
      double d = ...;
      ...
      t->valueType = DOUBLE; // where DOUBLE is some kind of integer constant
      t->val = malloc( sizeof d );
      if ( t->val )
        *(double *) t->val = d;
      ...
    }
    
    void assignIntVal( struct Table *tbl )
    {
      int x = ...;
      ...
      tbl->valueType = INT;
      tbl->val = malloc( sizeof x );
      if ( tbl->val )
        *(int *) tbl->val = x;
      ...
    }
    
    void printVal( struct Table tbl )
    {
      switch( tbl.valueType )
      {
        case CHAR:
          printf( "%d '%c'\n", tbl.id, *(char *) tbl.val );
          break;
    
        case INT:
          printf( "%d %d\n", tbl.id, *(int *) tbl.val );
          break;
    
        ...
    
        case DOUBLE:
          printf( "%d %f\n", tbl.id, *(double *) tbl.val );
          break;
    
        ...
      }
    }
    


2 commentaires

Merci beaucoup, ce serait génial si vous pouviez montrer un exemple de la manière de l'utiliser dans une autre fonction «hors de portée» comme indiqué au paragraphe 2. Si je l'utiliserai hors de Dou, puis-je utiliser un vide Pointeur de la même manière (pour stocker un pointeur à n'importe quel type)?


Je ne sais pas si je comprends bien. La première façon, lorsque je crée un élément à structer dans la fonction principale, je ne peux pas l'utiliser dans testfunc () pour E.g? Si oui, je ne comprends pas la différence dans l'exemple.