Esercizio sui record di attivazione ?

Messaggioda simonerusso64 » 08/08/2018, 20:27

Salve,
del seguente codice devo scrivere la stampa a video e lo sviluppo dei record di attivazione e dell'area heap.

Codice:
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.
simonerusso64
New Member
New Member
 
Messaggio: 73 di 80
Iscritto il: 30/10/2017, 23:44

Re: Esercizio sui record di attivazione ?

Messaggioda Albesa81 » 09/08/2018, 11:01

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.
Albesa81
Junior Member
Junior Member
 
Messaggio: 128 di 132
Iscritto il: 21/12/2010, 13:02

Re: Esercizio sui record di attivazione ?

Messaggioda simonerusso64 » 11/08/2018, 01:30

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[i] (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[i] (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.
simonerusso64
New Member
New Member
 
Messaggio: 74 di 80
Iscritto il: 30/10/2017, 23:44


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti