Vettore di puntatori a struct con malloc dinamica

Un esercizio complesso dove non creiamo una struttura dati statica con relativo vettore. Creiamo invece un vettore di puntatori a struct e a runtime ci riserviamo lo spazio di memoria per la struttura dati. Punto cardine di questo passaggio è la funzione malloc, versatile quanto pericolosa chiamata a sistema.

/*
* Un esercizio complesso dove non creiamo una struttura dati statica con relativo vettore.
* Creiamo invece un vettore di puntatori e a runtime ci creiamo lo spazio di memoria per la struttura dati
* punto cardine di questo passagio è la funzione malloc
*/


#include <iostream>

using namespace std;

struct data
{
    int gg;
    int mm;
    int aaaa;
};
typedef struct data Data;

struct posto
{
    int     id;
    int     classe;
    char    nome[20];
    char    cognome[20];
    Data    dataPrenotazione;
};
typedef struct posto Posto;

#define N 100

Posto * leggi();
void stampa(Posto * []);

int main()
{
    //prima anomalia: vettore di posti non è statico, ma un vettore di puntatori a posto
    Posto * vettorePosti[N];

    int n=0;

    //inizializzo il vettore con tutti i punatori a NULL
    for (int i=0; i < N; i++)
    {
        vettorePosti[i] = NULL;
    }

    //inzio del corpo principale
    while(n == 0 || n > N)
    {
        cout << "Quanti posti vuoi prenotare? ";
        cin >> n;
    }

    for (int i=0; i < n; i++)
    {
        vettorePosti[i]= leggi();
    }

    stampa(vettorePosti);

    return 0;
}

Posto * leggi()
{
    Posto * buffer;

    //mi creo un buffer su cui leggere i dati per poi inserirli
    //o meglio puntarli al vettore nella prima posizione disponivbile
    buffer=(struct posto *)malloc(sizeof(struct posto));
    cout << endl <<"#Posto: ";
    cin >> buffer->id;
    cout << "Classe: ";
    cin >> buffer->classe;
    cout << "Nome: ";
    cin >> buffer->nome;
    cout <<"Cognome: ";
    cin >> buffer->cognome;
    cout << "Giorno prenotazione: ";
    cin >> buffer->dataPrenotazione.gg;
    cout <<"Mese prenotazione: ";
    cin >> buffer->dataPrenotazione.mm;
    cout <<"Anno prenotazione: ";
    cin >> buffer->dataPrenotazione.aaaa;

    return buffer;
}

void stampa(Posto * _vettorePosti[])
{
    for (int i=0; i < N; i++)
    {
        //provo a stampare tutto il vettore ma controll osolo i puntatori valorizzati
        //se no navessi dichiarato all'inio tutto a NULL cosa accadeva?
        if (_vettorePosti[i] != NULL)
        {
            cout << "|-----------------------|" << endl;
            cout << "|-------Posto "<< _vettorePosti[i]->id <<"--------|"<< endl;
            cout << "|-----------------------|"<< endl;
            cout << "Classe: " << _vettorePosti[i]->classe << endl;
            cout << "Nome: " << _vettorePosti[i]->nome << endl;
            cout << "Cognome: " << _vettorePosti[i]->cognome << endl;
            cout << "Data prenotazione: " << _vettorePosti[i]->dataPrenotazione.gg << "/" <<_vettorePosti[i]->dataPrenotazione.mm << "/" << _vettorePosti[i]->dataPrenotazione.aaaa<< endl;
        }
    }
}

Ultima modifica 5 Giugno 2022