Question

Je vais avoir des problèmes en essayant d'utiliser un tableau de struct, qui ne possède pas une taille initiale. Comment puis-je faire cela? Ceci est mon struct:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
} *atom;

Au cours de mon programme que je allocation taille du tableau de struct comme ceci:

  atom = new carbon[PARTICLE_NUM];

Le problème est de savoir comment je puis utiliser cette struct dans d'autres fichiers. J'ai créé un fichier d'en-tête et de mettre cela dans ce

extern struct carbon *atom;

Mais il arrive avec cette erreur:

setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’

Je sais que je ne devrais pas utiliser des variables globales, mais je veux juste tester ceci en premier. Merci à l'avance pour l'aide.

Était-ce utile?

La solution

Le fichier source où vous utilisez atom a besoin de la définition complète de la structure carbon.

Mettre la structure ainsi que l'extérieur dans le même fichier d'en-tête, comme ceci:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
};

extern struct carbon *atom;

La définir la atom variable dans l'un de vos fichiers source:

struct carbon *atom = 0;

Maintenant, chaque fois que vous devez atom d'accès, le fichier d'en-tête où la structure et la déclaration est extern, et cela devrait fonctionner.

PS. Au lieu d'avoir la variable atom dans l'espace de noms global, vous pouvez le mettre dans son propre espace de noms:

namespace some_clever_name
{
    struct carbon { ... };
    extern carbon *atom;
}

Et mettre cela dans un fichier source:

some_clever_name::carbon *some_clever_name::atom = 0;

Autres conseils

La définition des besoins de struct être dans le fichier d'en-tête.

Vous devez inclure la définition de la structure carbon dans un fichier d'en-tête puis d'inclure ce fichier d'en-tête dans les fichiers (ou .h .cpp) où vous obtenez ces erreurs de type incomplètes.

Pourquoi l'erreur? Chaque fois que vous utilisez une déclaration en avant, ce type est un type incomplet pour le compilateur, c'est parce que le compilateur sait seulement que l'entité déclarée avant est un type de données, mais il ne sait rien au sujet de la mise en page ou de ses composants internes, donc si vous effectuez une opération qui a besoin compilateur besoin du type de disposition, il se plaint à l'erreur.

Dans votre cas, les besoins du compilateur de connaître le sizeof la structure carbon allouer suffisamment de mémoire, ce qui ne peut pas, car il est le type déclaré avant et par conséquent, il se plaint de l'erreur.

Comme les autres réponses disent, vous devez inclure la définition de la structure dans un fichier d'en-tête. Mais demandons-nous pourquoi vous besoin?

C ++ a dès le départ été basé sur C, et hérite de C une stratégie simple de compilation: le compilateur fait une passe et ni le compilateur ni l'éditeur de liens doit avoir besoin de quoi que ce soit d'accès à l'exception du dossier ils sont présentés. Lorsque C et UNIX ont d'abord été développés, des espaces d'adressage étaient limités et les processeurs étaient plus lents que la plupart des gens peuvent imaginer -. Mon Kindle Fire est plutôt un plus grand ordinateur que tout ce que j'utilisé jusqu'à ce que 90

Parce qu'ils faisaient le simple compilateur, au lieu d'utiliser des schémas plus complexes comme PL / I (un des ancêtres de C) fait, ils ont construit le préprocesseur et l'utilisation inclure des fichiers. Le compilateur a besoin de connaître la « forme » de la structure de sorte qu'il peut générer du code - par exemple si vous voulez mass d'accès, vous devez connaître le décalage depuis le début de la struct. Ainsi, en C et C ++, vous devez inclure, textuellement, la description de cette "forme".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top