Costruisci "prototipi" in (semplice) C?

1

Come dice il titolo, può essere fatto?

struct Room{

    char *type; //Lecture hall, laboratory, etc.
    char *name;

    int  *capacity; //How may people it can hold

    struct Building *building;
};

struct Building{

    char *name;
    char *type; //Administrative, school, etc.

    int  *rooms; //How many does it have
    int  *total_capacity; //Total capacity of the rooms

    struct Room *room;
};

Sto cercando di simulare un database usando struct matrici per simulare le tabelle.

Come si può vedere sopra, ho un "tavolo" di edifici e un altro per le stanze. Ogni edificio ha una lista di indicatori per le sue stanze, e ogni stanza ha bisogno di un puntatore per l'edificio in cui è situata.

E qui arriva il problema, qualunque sia definito per primo si lamenterà che l'altro non è definito, che, per le funzioni, potrebbe facilmente essere risolto usando un prototipo, ma non riesco a trovare nulla del genere per struct

Ho provato cose come

struct Building;
struct Building();
struct Building{};
struct Building(){};

Insieme alla variazione di typedef , ma nulla sembra funzionare. Esiste una prototipazione per le strutture? In caso contrario, qual è la soluzione alternativa, se presente?

    
posta Rares Dima 02.12.2016 - 03:03
fonte

2 risposte

1

struct Building; avrebbe dovuto funzionare:

struct Building;

struct Room{

    char *type; //Lecture hall, laboratory, etc.
    char *name;

    int  *capacity; //How may people it can hold

    struct Building *building;
};

struct Building{

    char *name;
    char *type; //Administrative, school, etc.

    int  *rooms; //How many does it have
    int  *total_capacity; //Total capacity of the rooms

    struct Room *room;
};
    
risposta data 02.12.2016 - 03:06
fonte
0

La risposta di Jerry risolverà il tuo problema immediato, ma penso che dovresti riconsiderare il tuo modello di dati. Le relazioni circolari sono quasi sempre cattive juju e dovrebbero essere evitate quando possibile.

Penso che dovresti prendere in considerazione la creazione di una terza struttura che associ stanze ed edifici tra loro, ad esempio:

struct Room {
  // room-specific data
};

struct Building {
  // building-specific data
};

struct BuildingRoomsAssoc {
  struct Building *building; 
  struct Room *room;
};

e avere una voce univoca per ogni mappatura di edifici e stanze:

struct BuildingRoomAssoc buildingRoomMap[N];
...
struct Building *b = malloc( sizeof *b );
b->name = strdup( "The Hilton Plaza" );
b->type = strdup( "swanky hotel" );

struct Room *r = malloc( sizeof *r );
r->name = strdup( "Grand Ballroom" );
r->type = strdup( "swanky ballroom" );
r->capacity = 200;

buildingRoomMap[i].building = b;
buildingRoomMap[i].room = r;
i++;

struct Room *r = malloc( sizeof *r );
r->name = strdup( "Brazos Room" );
r->type = strdup( "small meeting room" );
r->capacity = 20;

buildingRoomMap[i].building = b;
buildingRoomMap[i].room = r;
i++;

Quindi, puoi cercare buildingRoomMap per una stanza specifica e trovare l'edificio corrispondente, o per un edificio specifico e trovare tutte le stanze corrispondenti. Avrai voglia di trovare una struttura più sofisticata di una matrice piatta per la tua classe associativa, ma questo dovrebbe almeno indirizzarti nella giusta direzione.

    
risposta data 05.12.2016 - 18:04
fonte

Leggi altre domande sui tag