PDA

View Full Version : [c] stack con array


gepeppe
09-11-2007, 23:30
salve a tutti m devo sviluppare uno stack statico con array, in cui ogni elemento contiene una stringa, quindi uso un array di puntatori a char. Solo che ogni volta che tolgo un elemento sembra che contanga na stringa indefinita. Vi posto lo stack:

#define MAX 1000
#define EMPTY -1
#define FULL (MAX - 1)
/*questo è lo stack con l'array di "stringhe"*/
typedef struct stack{
char *s[MAX];
int top;
} stack;

/*funzioni*/

void reset(stack *stk)
{
stk -> top = EMPTY;
}
void push(char *string, stack *stk)
{
int TOP;
TOP = stk -> top++;
stk -> s[TOP] = calloc(8, sizeof(char));
strcpy(stk -> s[TOP], string);
}
char *pop(stack *stk)
{
return (stk -> s[stk -> top--]);
}
char *top(stack *stk)
{
return (stk -> s[stk -> top]);
}
int empty(stack *stk)
{
/*restituisce 1 se vuoto*/
return (stk -> top == EMPTY);
}
int full(stack *stk)
{
/*restituisce 1 se è pieno*/
return (stk -> top == FULL);
}

Se ora eseguo questa piccola parte di codice mi da errore:


stack stk;
char temp[8];

reset(&stk);

push("casa", &stk);
push("mare", &stk);
/*non voglio perdere il valore tolto*/
strcpy(temp, pop(&stk));
printf("%s\n", temp);
printf("%s\n", pop(&stk));

wingman87
10-11-2007, 00:00
Io credo che l'errore sia nel push, mi sembra, ma non sono sicuro, che l'istruzione
TOP = stk -> top++;
metta in TOP il valore di stk->top e dopo incrementi stk->top mi sembra però strano che non ti dia errore già dal primo push.. Prova a dividere l'istruzione in due, prima l'incremento e poi l'assegnazione e vedi se così funziona.

71104
10-11-2007, 08:36
in effetti si, al primo push fai un buffer underflow...

gepeppe
10-11-2007, 11:41
edit..nulla, ora sembra funzionare...grazie..ma mi rifarò sentire :D

gepeppe
10-11-2007, 12:47
vabbè..ci rinuncio!! di nuovo non funziona!!! forse è sbagliata come implementazione dello stack con array. Vi allego il sorgente del file dello stack, basta provatelo e vedrete che non va..ma non riesco proprio a capire il motivo....la cosa più strana, è che dopo l'istruzione reset, che inizializza top a -1, quando richiamo il push inizia da zero, poi incrementa, va a 1, e quindi inizia a salvare dal posto 1..provare per credere!!! :(