Dans votre code, l'initialisation
Outer_t outer_instance = {
{NULL},
{
0,
1,
2,
3,
table_defined_somewhere_else,
}
};
est invalide. Vous essayez d'affecter NULL
à Outer_t.tableA
qui est de type non-pointeur Inner_t
. NULL
ne peut être affecté qu'à des pointeurs. La plupart des compilateurs C définissent NULL
comme 0
ou ((void*)0)
. En fonction de votre compilateur, cette syntaxe peut être autorisée mais sera étendue à 0
, définissant ainsi tous les champs de la première structure Inner_t
à zéro. En tout cas, ce code ne fera pas ce que je crois que vous croyez.
Votre notion de tableA
étant indéfinie ou inexistante est erronée. Comme vos structures sont actuellement définies, la déclaration d'un objet de type Outer_t
créera automatiquement deux objets Inner_t
en tant que membres de structure (et ces structures Inner_t
créeront automatiquement les objets dont ils sont composés, etc.). Si outer_instance
existe, alors outer_instance.tableA
et outer_instance.tableB
sont garantis d'exister. Ils ne peuvent pas être "indéfinis" (ils sont définis lorsque vous avez défini le type de données Outer_t
) ou "NULL" (n'a aucune signification sauf pour les pointeurs). Une structure qui a des membres définis n'est jamais "vide".
Maintenant, il est un problème valide si oui ou non tableA
ou tableB
ont été initialisés. Il n'y a pas de manière universellement appropriée de le faire. Une méthode consiste à remplir toute la structure avec une valeur prédéfinie lorsqu'elle est déclarée, et de vérifier la présence de cette valeur comme un signe que la structure n'a pas été initialisée. Cela suppose toutefois qu'il existe une valeur que vous ne devriez jamais considérer comme des données valides dans cette structure; plusieurs fois, une telle valeur n'existe pas.
Si vous voulez construire votre code de telle sorte que les membres de Outer_t
peuvent ou non exister, alors vous devez utiliser des pointeurs (tels que Inner_t* tableA
) en tant que membres de Outer_t
au lieu des structures. De cette façon, vous pouvez NULL le pointeur pour indiquer une table inexistante. Cependant, vous ne seriez pas capable de déclarer le contenu des structures internes en même temps que la structure externe comme vous le faites actuellement.
Edit: En regardant votre code mis à jour, il semble que vous obtenez cette erreur particulière parce que vous essayez d'assigner un objet de type Items_t
à un champ de type Items_t*
. Utilisez &items_instance
ici et votre erreur devrait disparaître (à condition que items_instance
est défini avantouter_instance
, et tous les éléments de items_instance
peuvent être déterminés au moment de la compilation).
Cela n'a aucun sens. 'tableA' ne peut pas être' NULL'. Le champ 'tableA' a le type' Inner_t'. 'Inner_t' est une structure, pas un pointeur. Comparer un objet struct à 'NULL' n'a aucun sens, ce que vous dit le compilateur. Expliquez ce que vous essayez de faire. – AnT
Je comprends votre point AndreyT.Je sais que le compilateur me dit que je ne peux pas comparer un objet struct à NULL parce que ce n'est pas un pointeur. Voir, j'ai besoin de vérifier si tableA dans une structure Outer_t est vide/NULL ou n'a pas été défini ou n'existe pas (quel que soit le terme correct), puis utilisez la tableB.That est tout. Il y a une deuxième alternative, qui consiste à faire "Inner_t * tableA;" à l'intérieur de Outer_t.but alors comment instancier outer_instance avec tableA vide/NULL ... – user322541
si tableA était 'Inner_t * tableA' à la place, vous l'initialiseriez à NULL exactement comme votre code est maintenant. – nos