web-dev-qa-db-fra.com

Comment vérifier si une structure est NULL en C ou C++

j'ai la structure suivante

typedef struct 
{
   char      data1[10];
   char      data2[10];
   AnotherStruct  stData;
}MyData;

pour une raison quelconque, les développeurs choisissent de ne pas utiliser le stData comme pointeur, je dois donc vivre avec cela . mon problème est comment puis-je vérifier si le membre stData est vide? parce que s'il est vide, j'ai besoin de sauter certaines choses dans mon code.

toute aide est appréciée

12
user2101801

Vous devez trouver un moyen de marquer AnotherStruct stData vide.

  • Commencez par vérifier (ou revérifier) ​​la documentation et les commentaires relatifs à AnotherStruct, éventuellement demander à ceux qui les ont créés s’ils sont disponibles, de vérifier s’il existe un moyen officiel de faire ce que vous voulez.

  • Peut-être que cette structure a un pointeur, et si c'est un pointeur nul, la structure est vide. Ou peut-être existe-t-il un champ entier où 0 ou -1 ou quelque chose qui signifie vide. Ou même un champ booléen pour le marquer comme vide.

  • S'il n'y en a pas, vous pouvez peut-être ajouter un tel champ ou une telle interprétation d'un champ.

  • Si la procédure ci-dessus échoue, ajoutez un champ booléen à MyData pour indiquer si stData est vide.

  • Vous pouvez également interpréter certaines valeurs (telles que chaîne vide? Pleins d'octets 0xFF?) De data1 et/ou data2, qui signifie vide stData.

  • Si vous ne pouvez pas modifier ou réinterpréter le contenu de l'une ou l'autre des structures, vous pouvez placer des éléments vides et non vides dans différents conteneurs (tableau, liste, tout ce que vous avez). Si les éléments MyData sont alloués à partir du tas un par un, cela revient essentiellement à avoir une liste libre .

  • Si vous avez mélangé des éléments vides et non vides dans un même conteneur, vous pouvez créer un autre conteneur avec pointers ou un index des éléments non vides (ou des éléments vides, ou autre chose). correspond à votre besoin). Cela a la complication supplémentaire, que vous devez garder deux conteneurs synchronisés, ce qui peut ou peut ne pas être trivial.

8
hyde

Je me trouve dans une situation similaire à celle que vous avez trouvée. Je suis obligé de mettre en paquets une structure donnée et connaître le nombre exact d'octets dans la structure m'aiderait à sérialiser la structure. Certaines structures étant toutefois vides, la sérialisation ne parvient pas à aligner le nombre exact d'octets. 

Bien que ce soit 3 ans plus tard, j'ai trouvé la solution suivante qui a fonctionné pour moi:

template <typename T> struct is_empty {
    struct _checker: public T { uint8_t dummy; };
    static bool const value = sizeof(_checker) == sizeof(T);
};

Le résultat peut être interrogé sous la forme is_empty<T>::value et est disponible au moment de la compilation.

template <typename S>
typedef union {
    struct __attribute__((__packed__)) {
        ObjId   id;
        S       obj;
    } dataStruct;
    std::array<uint8_t, (sizeof(dataStruct) - is_empty<S>::value)> byteArray;
} _msg_t;

Voici les références: 

1
sirajissani

s'il ne s'agit pas d'un pointeur, la mémoire du membre de structure est allouée à la création de l'objet MyData.Lorsque vous définissez vos structures, définissez-les toutes à zéro avec calloc ou memset. 

1
Rajath N R

vous pouvez trouver une variable de drapeau. ex.

struct AnotherStruct {
    bool valid;
    char aother_data1[10];
    char aother_data1[10];
    //...
};

if (stData.valid==true){
    //do something
}
1
thomas

Je suppose que la définition de la structure fait partie de fonctionnalités/bibliothèques tierces, dans lesquelles le tiers peut bien être une personne de votre propre entreprise. 

Si les développeurs ont choisi de ne pas faire de stData un pointeur, il y a des raisons. Ils auront une idée sur la façon d’exprimer "stData is empty", s’il est même permis de le faire. Vous devez absolument essayer de rechercher ces sémantiques dans la documentation ou de leur parler. N'essayez pas d'ajouter votre propre sémantique à une structure ayant un but spécifique et une sémantique. 

Donc, s'il y a est une manière prédéfinie d'exprimer cette partie de la structure est vide, utilisez cette méthode. S'il n'est peut-être pas vide pour les utilisations auxquelles il est destiné, n'essayez pas de le vider. En un mot, n'utilisez pas une classe/structure de manière à ne pas être utilisée. Au lieu de cela, si vous vous trouvez dans une situation où vous n'avez qu'une partie des données nécessaires au bon fonctionnement de 'MyData', écrivez votre propre structure 'MyPartialData' pour gérer cette situation et traduisez-la en 'MyData'. une fois que vous avez tout ce dont vous avez besoin et que vous êtes prêt à interagir avec l’API tierce.

0
Arne Mertz

Struct est un type défini par l'utilisateur, car int est un type intégré.

struct x;
int y;

Essayez d'abord de répondre "Comment pouvez-vous déterminer si votre int est vide OR pas après l'avoir déclaré?"

Concernant la solution: - Utilisez votre structure de cette façon si vous voulez savoir si elle est initialisée OR non: -

struct X
{
  bool b;
  X() : b(false) {}  
};

définissez-le vrai une fois initialisé.

0
ravi