Frage

Ich habe Probleme, eine Reihe von Strukturen zu verwenden, die keine Anfangsgröße haben. Wie mache ich das? Das ist meine Struktur:

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

Während meines Programms habe ich die Größe des Strukturarrays wie folgt zugewiesen:

  atom = new carbon[PARTICLE_NUM];

Das Problem ist, wie ich diese Struktur dann in anderen Dateien verwende. Ich habe eine Header -Datei erstellt und sie hineingefügt

extern struct carbon *atom;

Aber es erscheint mit diesem Fehler:

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

Ich weiß, ich sollte keine globalen Variablen verwenden, aber ich möchte dies nur zuerst testen. Vielen Dank im Voraus für die Hilfe.

War es hilfreich?

Lösung

Die Quelldatei, in der Sie verwendet werden atom braucht die vollständige Definition der carbon Struktur.

Stellen Sie die Struktur mit dem externen in derselben Header -Datei wie folgt zusammen:

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

extern struct carbon *atom;

Die Variable definieren atom In einer Ihrer Quelldateien:

struct carbon *atom = 0;

Jetzt, wann immer Sie zugreifen müssen atom, Fügen Sie die Header -Datei ein, in der die Struktur und die externe Erklärung vorliegen, und sie sollte funktionieren.

Ps. Anstatt das zu haben atom Variable Im globalen Namespace könnten Sie es in seinen eigenen Namespace einfügen:

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

Und legen Sie dies in eine Quelldatei:

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

Andere Tipps

Die Definition der Struktur muss in der Header -Datei liegen.

Sie müssen die Definition der Struktur einfügen carbon in einer Header -Datei und dann diese Header -Datei in Dateien eingeben (in Dateien (.h oder .cpp) wo Sie diese unvollständigen Typfehler erhalten.

Warum der Fehler?
Wenn Sie eine Vorwärtsdeklaration verwenden, wird dieser Typ zu einem unvollständigen Typ für den Compiler. Dies liegt daran Operation, der Compiler benötigt, um das Typ -Layout zu benötigen, das sich mit dem Fehler beschwert.

In Ihrem Fall muss der Compiler die Größe der Struktur kennenlernen carbon genug Speicher zuzuweisen, was es nicht kann, da es vorwärts deklarierter Typ ist, und beklagt sich daher mit dem Fehler.

Wie die anderen Antworten sagen, müssen Sie die Definition der Struktur in eine Header -Datei aufnehmen. Aber fragen wir uns warum du brauchst das?

C ++ basiert von Anfang an auf C und erbt eine einfache Kompilierungsstrategie: Der Compiler macht einen Durchgang und weder der Compiler noch der Linker müssen auf irgendetwas zugreifen, außer auf die Datei, die sie präsentiert werden. Als C und Unix zum ersten Mal entwickelt wurden, waren die Adressräume begrenzt und die Prozessoren waren langsamer als die meisten Menschen vorstellen können - mein Kindle -Feuer ist eher ein größerer Computer als alles, was ich bis in die 90er Jahre verwendet habe.

Da sie den Compiler einfach machten, anstatt komplexere Schemata wie PL/I (einer der Vorfahren von C) zu verwenden, bauten sie den Präprozessor und verwenden Dateien einbezogen. Der Compiler muss die "Form" der Struktur kennen, damit er Code generieren kann - beispielsweise, wenn Sie zugreifen möchten mass, Sie müssen den Offset von Beginn der Struktur kennen. In C und C ++ müssen Sie also die Beschreibung dieser "Form" textuell einbeziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top