• Non ci sono risultati.

Record di Attivazione e

N/A
N/A
Protected

Academic year: 2021

Condividi "Record di Attivazione e"

Copied!
14
0
0

Testo completo

(1)

Record di Attivazione e

Parametri Formali di una Funzione

Prof.Ing.S.Cavalieri

(2)

Heap

Stack

Area Statica Area Programma

Area Dati

Area di Memoria Stack

(3)

Record di Attivazione

Return

Address Link

Dinamico Parametri Formali

Variabili Locali Record di Attivazione

Valore di Ritorno

(se presente)

(4)

Record di Attivazione:

Link Dinamico

#include <stdio.h>

int x;

void R (int a) { x=a;

} void Q (int b) { R(b);

printf(“\n%d”,b);

}

void P (void) { int a=10;

Q(a);

printf(“\n%d”,a);

} int main(void){

P();

}

Return

Address Link

Dinamico Parametri Formali

Variabili Locali

P()

Return Address

Link Dinamico Parametri Formali

Variabili Locali

R()

Return

Address Link

Dinamico Parametri Formali

Variabili Locali

main()

Return Address

Link Dinamico Parametri Formali

Variabili Locali

Q()

Stack

(5)

Record di Attivazione:

Return Address

#include <stdio.h>

int x;

int R (int a) { return a;

}

void Q (int b) { int a;

B a=R(b);

if (!a) printf(“\nCiao”);

}

int main(void){

Q(5);

A printf(“\nFine “);

}

A

DinamicoLink

Parametri Formali Variabili Locali

Q()

Return

Address Link

Dinamico Parametri Formali

Variabili Locali

main()

B

DinamicoLink

Parametri Formali Variabili Locali e valore di ritorno

R()

Stack

(6)

#include <stdio.h>

double fact (unsigned long);

int main(void){

int x=3, y;

A y=fact(x);

}

double fact (unsigned long n) { double p=1;

while (n>0) p*=n--;

return p;

}

Return

Address -

x y

3 Record di

Attivazione del main

A Link

Dinamico n

p

3 Record di

Attivazione della

funzione fact

Valore ritorno

2 1 0

1 3 6

6

? 6

Record di Attivazione:

Parametri e Valore Ritorno

(7)

#include <stdio.h>

float x=10.0;

void prova ( int );

int main(void){

int x=4;

x++;

prova(x);

A printf("%d \n", x);

}

void prova (int a){

char x=‘a’;

x+=a;

}

Return

Address

-

x 4

Record di Attivazione del main

A

Link

Dinamico

a x

5

‘a’

Record di Attivazione della

Funzione prova

‘f’

Area Statica

x 10.0

5

Record di Attivazione:

Variabili Locali

(8)

Passaggio Parametri : Passaggio per Valore !

#include <stdio.h>

void scambia ( int , int );

int main(void){

int x=4, y=5;

scambia(x,y);

A printf("%d %d \n", x, y);

}

void scambia ( int a, int b) { int tmp=a;

a=b;

b=tmp;

}

Return

Address

-

x y

4 5

Record di Attivazione del main

A

DinamicoLink

a

b

4 5

Record di Attivazione della

Funzione scambia

tmp 4

5

4

(9)

Passaggio Parametri:

Soluzione passaggio per &

#include <stdio.h>

void scambia ( int *, int *);

int main(void){

int x=4,y=5;

scambia(&x,&y);

printf("%d %d \n",x,y);

}

void scambia ( int *a, int *b) { int tmp=*a;

*a=*b;

*b=tmp;

}

Return

Address -

x y

Record di Attivazione del Main

Return

Address Link

Dinamico

a b

4

5

Record di Attivazione della

Procedura Scambia

tmp 4

5

4

(10)

#include<stdio.h>

#define C 20

#define FFLUSH while (getchar()!='\n')

void LeggiStringa(char s[], unsigned long dim) { unsigned long i;

for (i = 0; i<dim - 1; i++)

if ((s[i] = getchar()) == '\n') break;

if (i == dim - 1) FFLUSH;

s[i] = '\0';

}

typedef struct {

char cognome[C], nome[C];

unsigned short eta;

} persona;

Passaggio Struct per &

persona elem;

void LeggiPersona(persona *p) { printf("\nInserisci il Cognome ");

LeggiStringa(p->cognome, C);

printf("\nInserisci il Nome ");

LeggiStringa(p->nome, C);

printf("\nInserisci l'eta' ");

scanf("%hu", &p->eta);

}

void StampaPersona(persona x) {

printf("\nCognome = %s ", x.cognome);

printf("\nNome = %s ", x.nome);

printf("\nEta' = %hu ", x.eta);

}

int main(void) {

LeggiPersona(&elem);

StampaPersona(elem);

}

(11)

Passaggio di Parametri Vettore

• i parametri formali passati per valore relativamente ad un vettore, si esprimono nelle tre forme equivalenti:

tipobase * nome_parametro;

tipobase nome_parametro[];

tipobase nome_parametro[dimensione];

• tale regola vale sia nel caso in cui il vettore è definito secondo la sintassi del linguaggio C:

tipobase nome_vettore[dimensione],

sia nel caso in cui il vettore sia stato allocato in modo dinamico nell’heap, tramite il comando:

nome_vettore=(cast)malloc(dimensione vettore);

(12)

Passaggio di Parametri Vettore

#include<stdio.h>

#include<stdlib.h>

#define FFLUSH while(getchar()!='\n')

float *vett;

unsigned long n;

void riempi(float v[], int dim){

unsigned long i;

for (i=0; i<dim; i++) {

printf("Inserisci l'elemento di indice %u ",i);

scanf("%f",v+i); //scanf("%f",&v[i]);

FFLUSH;

} }

void stampa(float v[], int dim){

unsigned long i;

for (i=0; i<dim; i++)

printf("\nElemento di indice %u = %f ",i,v[i]);

}

float max(float v[], int dim){

unsigned long i;

float max=v[0];

for (i=1; i<dim; i++) if (v[i]>max) max=v[i];

return max;

}

int main(void) {

printf("\nInserisci la dimensione ");

scanf("%u",&n);

vett=(float *)malloc(n*sizeof(float));

riempi(vett,n);

stampa(vett,n);

printf("\nMassimo elemento = %f ",max(vett,n));

}

(13)

Passaggio di Parametri Vettore

#include<stdio.h>

#define N 6

float vett[N];

void riempi(float v[], unsigned long dim){

unsigned long i;

for (i=0; i<dim; i++) {

printf("Inserisci elemento %u ",i);

scanf("%f", v+i);//scanf("%f",&v[i]);

} }

int main(void) {

riempi(vett,N);

A printf(" Ciao ");

}

Area Statica

vett=00FA

Return

Address -

Record di Attivazione del main

A Link

Dinamico

i 0

Record di Attivazione della

funzione riempi

1 ... 6

v

dim

6

00FA Stack

Poteva essere anche dinamico

(14)

Variabili Locali Statiche

#include <stdio.h>

#define N 10 void prova (int);

int main(void) { int i;

for (i=0;i<N; i++) prova(i);

}

void prova (int a){

static int x=0;

x+=a;

printf("\n%d ", x);

}

Return

Address

-

i 0

Record di Attivazione del main

A

Link

Dinamico

a i

Record di Attivazione della

Funzione prova

Area Statica x

10

0 45

Riferimenti

Documenti correlati

Dalla mancanza di dati per bevette, bevei e bevve, si potrebbe concludere che il termine bevè è un perfetto debole formato sull’analogia degli altri verbi di

Allo stesso modo, partendo da una frazione, ad esempio 12/24, e dividendo numeratore e denominatore per un divisore comune possiamo ottenere delle frazioni equivalenti

processo 3361 all’interno della sezione critica processo 3362 prima della sezione critica. processo 3363 prima della

Esso contiene: l’indirizzo di ritorno all’istruzione che il main dovrà eseguire dopo la conclusione della funzione fact (tale istruzione è y=valore di ritorno della

 I parametri formali assumono come valore iniziale quello dei parametri passati dal chiamante (esempio main).  Le modifiche ai parametri formali non

Se due frazioni corrispondono allo stesso numero razionale, si dicono equivalenti. Fra loro si può scrivere il segno

Questi rappresentano

Dopo 5 ore vengono ripetute le determinazioni della troponina cardiaca che per la madre risulta 0,30 ng/ml, per la figlia 0,33 ng/.. ml e per il ragazzo