[c++] array in una struct

Oo.Stud.ssa.oO
Ho questa struttura:
struct{
         int capacity;
         int head;
         int buffer[];
}pila;


voglio fare la funzione CreatePila che inizializzi la struttura ricevendo come parametro la capacità:
pila * CreatePila( int capacity){
        pila * p = (pila *) malloc(sizeof(pila));
        p->capacity = capacity;
        p->head = -1;
        return p;}


ma non so come comportarmi con l'array: vorrei che questa funzione mi mi mettesse che capacity è la dimensione dell'array , ma come faccio?

p->buffer =   

:|

Risposte
claudio862
struct {
    int capacity;
    int head;
    int * buffer;
} pila;

pila * CreatePila( int capacity)
{
    pila * p = malloc(sizeof(pila));
    p->capacity = capacity;
    p->head = -1;
    p->buffer = malloc(capacity * sizeof(*(p->buffer)));
    return p;
}

Dovrai anche scrivere una funzione DeletePila().

Oo.Stud.ssa.oO
"claudio86":
struct {
    int capacity;
    int head;
    int * buffer;
} pila;

pila * CreatePila( int capacity)
{
    pila * p = malloc(sizeof(pila));
    p->capacity = capacity;
    p->head = -1;
    p->buffer = malloc(capacity * sizeof(*(p->buffer)));
    return p;
}

Dovrai anche scrivere una funzione DeletePila().



Grazie :)
Ma nelle parentesi dopo il sizeof non ci andrebbe un tipo?
Messo così mi da questo errore:
In function `pila* CreatePila(int)': 
incompatible types in assignment of `void*' to `int[0u]' 
[Build Error]  [pila.o] Error 1 

Perchè?

claudio862
"Oo.tania":
Ma nelle parentesi dopo il sizeof non ci andrebbe un tipo?

O un tipo, o una variabile (della quale prende il tipo). p->buffer è di tipo int*, quindi *(p->buffer) è di tipo int. Puoi anche mettere direttamente int, ma così non devi cambiare niente in caso volessi cambiare p->buffer in double* o short*...

"Oo.tania":
Messo così mi da questo errore:
In function `pila* CreatePila(int)': 
incompatible types in assignment of `void*' to `int[0u]' 
[Build Error]  [pila.o] Error 1 

Perchè?

Hai cambiato nella struct "int * buffer" invece di "int buffer[]" ? Aggiungi anche il cast a malloc(), che non avevo fatto caso che stai usando C++ e non C.

Oo.Stud.ssa.oO
No, però ho messo buffer[MAX], può essere questo il problema?
Comunque, volendo aggirare il problema, se non gli passo la capacità come parametro, può andare così?
pila *CreatePila (){
     pila *p = (pila*)malloc(sizeof(pila));
     p->capacity = MAX;
     p->head = -1;
     cout<<"pila creata"<<endl;
     return p;}

è ok anche se l'array non lo inizializzo?
E ultima cosa, perchè la testa è inizializzata a -1 e non a 0?

claudio862
"int buffer[MAX]" indica un array di MAX elementi, quindi non c'è bisogno di allocare niente. MAX è una costante nota durante la compilazione, quindi se fai così non puoi avere pile di capacità diversa da MAX.
Non è necessario inizializzare l'array perché inizializzi i singoli elementi quando inserisci elementi nella pila. Devi però controllare quando leggi da una pila vuota o inserisci in una pila piena.

head indica l'indice dell'array in cui è presente l'ultimo elemento inserito (la testa). Ogni volta che inserisci un elemento incrementi head e scrivi l'elemento in p->buffer[p->head]. È inizializzato a -1 perché all'inizio non c'è nessun elemento, e quando inserisci il primo diventa 0.

Oo.Stud.ssa.oO
Chiarissimo, grazie 1000!!! :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.