Domanda

Ho problemi a cercare di usare una serie di strutture che non hanno una dimensione iniziale. Come faccio a fare questo? Questa è la mia struttura:

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

Durante il mio programma sto assegnando le dimensioni dell'array di strischi in questo modo:

  atom = new carbon[PARTICLE_NUM];

Il problema è come utilizzo questa struttura in altri file. Ho creato un file di intestazione e l'ho messo dentro

extern struct carbon *atom;

Ma si presenta con questo errore:

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

So che non dovrei usare variabili globali, ma voglio solo provarlo prima. Grazie in anticipo per l'aiuto.

È stato utile?

Soluzione

Il file di origine in cui si utilizza atom ha bisogno della definizione completa del carbon struttura.

Metti la struttura insieme all'esterno nello stesso file di intestazione, in questo modo:

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

extern struct carbon *atom;

La definizione della variabile atom In uno dei tuoi file di origine:

struct carbon *atom = 0;

Ora, ogni volta che devi accedere atom, includi il file di intestazione in cui è la struttura e la dichiarazione esterna e dovrebbe funzionare.

Ps. Invece di avere il atom Variabile nello spazio dei nomi globali, potresti metterlo nel suo spazio dei nomi:

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

E mettilo in un file di origine:

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

Altri suggerimenti

La definizione della struttura deve essere nel file di intestazione.

È necessario includere la definizione della struttura carbon In un file di intestazione e quindi includere quel file di intestazione nei file (.h o .cpp) dove stai ottenendo quegli errori di tipo incompleto.

Perché l'errore?
Ogni volta che si utilizza una dichiarazione in avanti, quel tipo diventa un tipo incompleto per il compilatore, questo è perché il compilatore sa solo che l'entità dichiarata in avanti è un tipo di dati ma non sa nulla sul layout o sui suoi interni, quindi se si esegue uno Funzionamento che richiede il compilatore per richiedere il layout del tipo che si lamenta dell'errore.

Nel tuo caso il compilatore deve conoscere la dimensione della struttura carbon Per allocare abbastanza memoria, che non può poiché è un tipo dichiarato in avanti e quindi si lamenta dell'errore.

Come dicono le altre risposte, è necessario includere la definizione della struttura in un file di intestazione. Ma chiediamoci perché hai bisogno di questo?

C ++ è stato dall'inizio basato su C e eredita da C una semplice strategia di compilazione: il compilatore fa un passaggio e né il compilatore né il linker dovrebbero accedere a qualsiasi cosa tranne il file che vengono presentati. Quando C e Unix sono stati sviluppati per la prima volta, gli spazi degli indirizzi erano limitati e i processori erano più lenti di quanto la maggior parte delle persone possa immaginare: il mio fuoco Kindle è piuttosto un computer più grande di qualsiasi cosa abbia usato fino agli anni '90.

Poiché stavano rendendo semplice il compilatore, invece di usare schemi più complessi come PL/I (uno degli antenati di C), hanno costruito il preprocessore e l'uso include i file. Il compilatore deve conoscere la "forma" della struttura in modo che possa generare codice, ad esempio se si desidera accedere mass, devi conoscere l'offset dall'inizio della struttura. Quindi, in C e C ++, è necessario includere, testualmente, la descrizione di quella "forma".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top