, e sono inciampato in due particolari problemi.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;
}
(perdonate il collage, però ho il codice distribuito in più file, ho copiato solo lo stretto indispensabile).
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}
e subito dopo l'allocazione la stessa stringa diventa
- Codice: Seleziona tutto
{0, 0, 0, 135153, 0 <repeats 11 times>}
Quel numero è RICORRENTE, sempre e comunque. Anche se uso la calloc, quella commentata, me lo ritrovo, solo che lo ritrovo all'undicesima posizione, e essendo STACK_LENGTH = 10 il programma "funzionerebbe" anche - ma mi rifiuto di accettare quella soluzione lol. Il memset successivo non serve a nulla. Se modifico con l'IDE il valore va benissimo, lo cambia e ciccia, però non capisco da dove arrivi. NON ho ancora provato a compilare su Win, mi pesa il c**o farlo bootare
.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?


, non va bene fare le cose così
!