Esercizio sui record di attivazione ?
Salve,
del seguente codice devo scrivere la stampa a video e lo sviluppo dei record di attivazione e dell'area heap.
Sono giorni che ci sto su, ma non riesco a venirne fuori.
Per quando riguarda la funzione main, ci sono. Poi quando si entra nella funzione 1 e 2 è che mi perdo ( probabile a causa dei puntatori ). Vi chiedo pertanto se potete scrivermi passo passo i passaggi da fare.
In allegato vi allego anche la soluzione.
del seguente codice devo scrivere la stampa a video e lo sviluppo dei record di attivazione e dell'area heap.
int FUN1(int c, int* VET) { int i; for (i = 0; i < c; i++) if (VET[i] <= c) printf("\n PUNTO C: %d", VET[i] % 5); else printf("\n PUNTO D: %d", c--); return; } int *FUN2(int* w, int k) { int i; int* z = (int*)malloc((--k)*sizeof(int)); *w = FUN1(k, w); for (i = 0; i < k; i++) z[i] = (*w)++; return z; } main(){ int MIOVET[] = { 2, 3, 8, 1 }; int *TUOVET; TUOVET = FUN2(&MIOVET[0], MIOVET[1]); printf("\n MIO=%d TUO %d", MIOVET[0], TUOVET[MIOVET[3]]); }
Sono giorni che ci sto su, ma non riesco a venirne fuori.
Per quando riguarda la funzione main, ci sono. Poi quando si entra nella funzione 1 e 2 è che mi perdo ( probabile a causa dei puntatori ). Vi chiedo pertanto se potete scrivermi passo passo i passaggi da fare.
In allegato vi allego anche la soluzione.
Risposte
Esegui il programma passo-passo, come se fossi il calcolatore.
Tieni presente che ogni qualvolta viene chiamata una funzione, sullo stack viene creato un cosiddetto "record di attivazione" dove ospitare l'indirizzo di ritorno al chiamante, i parametri in ingresso, le variabili locali ed eventuali valori restituiti dalla funzione stessa.
Tieni presente che ogni qualvolta viene chiamata una funzione, sullo stack viene creato un cosiddetto "record di attivazione" dove ospitare l'indirizzo di ritorno al chiamante, i parametri in ingresso, le variabili locali ed eventuali valori restituiti dalla funzione stessa.
Comincio ad eseguire il main :
&MIOVET[0] = 2 (cioè il primo elemento del MIOVET)
MIOVET[1] = (cioè il secondo elemento del MIOVET )
Passo poi a *FUN2
*w = 2 ( corrisponde a &MIOVET[0] )
k = 3 (corrisponde a MIOVET[1] )
int* z=(int *)malloc((--k)*sizeof(int));
Qui viene solo decrementato il valore di k.
k=2
Poi passo a FUN1
c=2 (corrisponde al valore di k)
*VET = 2 (corrisponde al valore di *w)
Entro nel ciclo for (i<2), quindi entro nell'if(VET (ossia 2) <= 2), vero
quindi stampo PUNTO C = 2 (perchè 2%5 è 2)
Rientro poi nuovamente nel ciclo for (1<2), quindi entro nell'if(VET (ossia 3) <=2) falso
quindi stampo PUNTO D = 2
Dopo il printf decremento c.
Quindi c=1
Ritorno poi a *FUN2 e in particolare a
*w = FUN1 (k, w)
Fin qui ci sono arrivato grazie anche al compilatore. Ora però perchè *w diventa 1 ?
Vi chiedo inotre di controllare anche se i vari passaggi e ragionamenti sono gusti.
&MIOVET[0] = 2 (cioè il primo elemento del MIOVET)
MIOVET[1] = (cioè il secondo elemento del MIOVET )
Passo poi a *FUN2
*w = 2 ( corrisponde a &MIOVET[0] )
k = 3 (corrisponde a MIOVET[1] )
int* z=(int *)malloc((--k)*sizeof(int));
Qui viene solo decrementato il valore di k.
k=2
Poi passo a FUN1
c=2 (corrisponde al valore di k)
*VET = 2 (corrisponde al valore di *w)
Entro nel ciclo for (i<2), quindi entro nell'if(VET (ossia 2) <= 2), vero
quindi stampo PUNTO C = 2 (perchè 2%5 è 2)
Rientro poi nuovamente nel ciclo for (1<2), quindi entro nell'if(VET (ossia 3) <=2) falso
quindi stampo PUNTO D = 2
Dopo il printf decremento c.
Quindi c=1
Ritorno poi a *FUN2 e in particolare a
*w = FUN1 (k, w)
Fin qui ci sono arrivato grazie anche al compilatore. Ora però perchè *w diventa 1 ?
Vi chiedo inotre di controllare anche se i vari passaggi e ragionamenti sono gusti.