Allora, intanzo il codice incriminato è il seguente:
Codice: Seleziona tutto
typedef struct stack_{
int* stack;
int* top;
} stack;
[...]
const int STACK_LENGTH = 10;
int main(int argc, char** argv) {
stack S;
S = stack_init(S);
[...]
extern const int STACK_LENGTH;
stack stack_init(stack S) {
//S.stack = calloc(STACK_LENGTH, sizeof(int));
if ((S.stack = (int*) malloc(STACK_LENGTH)) == NULL) {
fprintf(stdout, "Error while allocating stack.\n");
} else {
memset(S.stack, 0, STACK_LENGTH);
S.top = S.stack;
}
return(S);
}
[...]
void push(stack S, int x) {
if(!stack_full(S)) {
*(S.top) = x;
(S.top)++;
} else {
fprintf(stdout, "Stack overflow avoided - value discarded.\n");
}
return;
}Il primo problema è questo: la malloc mi alloca me**a (e fin qui ok) e il memset non funziona. Eclipse mi dice che, prima dell'allocazione, nelle 15 locazioni di memoria successive al puntatore int* S.stack vi è:
Codice: Seleziona tutto
{-1075572456, -1210256496, 2, -1075572412, -1075572400, -1208863784, 0, 1, 0, 134513245, -1209004044, -1208742688, 0, -1075572456, -601784191}
Codice: Seleziona tutto
{0, 0, 0, 135153, 0 <repeats 11 times>}
Ok, secondo problema, molto più grave a livello funzionale, non tiene conto dell'incremento del puntatore nella push. E' un puntatore perché volevo provare una soluzione alternativa al solito uso di un indice che viene incrementato, volevo usare un puntatore allocato inizialmente all'indirizzo della prima cella di memoria del vettore e poi incrementarlo mano a mano. Funzionare funziona, noto che l'indirizzo viene incrementato correttamente durante la push, ma al ritorno al main e alla successiva chiamata di push (è in un loop che va da 0 a STACK_LENGTH) viene resettato all'indirizzo originale :dunno:.
Qualche idea su dove andare a guardare per risolvere queste cose?

