[c++] array in una struct
Ho questa struttura:
voglio fare la funzione CreatePila che inizializzi la struttura ricevendo come parametro la capacità:
ma non so come comportarmi con l'array: vorrei che questa funzione mi mi mettesse che capacity è la dimensione dell'array , ma come faccio?
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
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().
"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è?
"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.
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ì?
è ok anche se l'array non lo inizializzo?
E ultima cosa, perchè la testa è inizializzata a -1 e non a 0?
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?
"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.
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.
Chiarissimo, grazie 1000!!!
