Stack – Passaggi di struct come parametri

Premi qui per scaricare il PDF

[adinserter block="7"]

Stack

Partendo dal main, lo stack (pila) si riempie con le variabili del sottoprogramma chiamato e l’indirizzo di ritorno (return) man mano che vengono chiamati i sottoprogrammi successivi.

La pila, è un tipo di dato astratto che viene usato in diversi contesti per riferirsi a strutture dati, le cui modalità d’accesso ai dati in essa contenuti seguono una modalità LIFO

LIFO → I dati vengono letti in ordine inverso rispetto a quello in cui sono stati inseriti scritti. Si riempie e si svuota dall’alto. “Last In First Out

Lo stack viene svuotato man mano che i sottoprogrammi terminano la loro esecuzione. Quando termina il main, lo stack è vuoto.

Lo stack ha una dimensione predefinita, nel caso vengano riempite tutte (tante variabili (parametri inclusi) e sottoprogrammi), si genera un errore in fase di esecuzione chiamato “stack overflow“.

Stack Pointer

Puntatore alla pila, un registro che contiene l’indirizzo della parola di memoria da leggere nello stack.

È necessario poichè permette di eseguire del codice, un numero arbitrario di volte, senza prevedere a priori quant’è questo numero odi volte.

Formula Array

#define DIM 50
void azzera(int a[])
{
	int i;
	for (i = 0; i < DIM; i++)
		a[i] = 0;
	return 0;
}

Formula Array bidimensionale

int base + (indice riga * dimensione colonna + indice colonna) * dimensione elemento

#define DIMCOL 70
#define DIMROW 50
void azzera (int a[][DIM])
{
	int i,j;
	for (i = 0; i < 50; i++)
		for (j = 0; j < 70; j++)
			cosa[i][j] = 0;
}

Nel parametro formale, non si mette la DIM delle righe dell’array multidimensionale. (Non si mette nessun valore nella prima parentesi quadra).

[adinserter block="7"]

Passaggio di una struct come parametro

É buona norma passarle sempre per indirizzo, NON per valore.(potrebbe essere passato per valore solo se ha elementi “piccoli”).

#include 

typedef struct prova
{
	int c1;
	float c2;
} prova;

void riempi (prova *x);

int main()
{
	prova a;
	//PASSAGGIO PER INDIRIZZO
	riempi (&a);
	.
	.
	.
	return 0;
}

void riempi(prova *x)
{
	*x.c1 = 11;
	*x.c2 = 3.14;
} 

Il C mette a disposizione l’operatore “” “meno maggiore” che può essere applicato solo ai puntatori che puntano ad una struttura.

void riempo(prova *x)
{
	x -> c1 = 11; //Equivale a *x.c1 = 11;
	x -> c2 = 3.14; //Equivale a *x.c2 = 3.14;
}

Se si vuole che una funzione agisca sulle variabili dell’ambiente del chiamante, occorre passare l’indirizzo di tali variabili (parametri passati per locazione o per indirizzo) → passaggio di copie di puntatori.

Tutti i parametri in C sono passati per copia. Le variabili passate come parametri a una funzione (parametri attuali), non cambiano valore nell’ambiente del chiamante (parametri passati per valore).

[adinserter block="7"]
typedef struct data 
{
	int giorno;
	char mese[12];
	int anno;
}data;

typedef struct valore
{
	float temperatura;
	data quando;
}valore;

void azzeratemp(valore x[]);

int main()
{
	valore campo[365];
	azzeratemp (camp);
	.
	.
	.
	return 0;
}

void azzeratemp (valore x[])
{
	int i;
	for (i = 0; i < 365; i++)
		x[i].temperatura = 0;
		x[i].quando.giorno = 0;
		x[i].quando.mese = "";
		x[i].quando.anno = 0;
}

//OPPURE
void azzeratemp (valore *x)
{
	int i;
	for (i = 0; i < 365; i++)
		(x + i) -> temperatura = 0; //Equivale a *(x+i).temperatura = 0
		*(x+i).quando.giorno = 0;
		*(x+i).quando.mese = "";
		*(x+i).quando.anno = 0;
}
[adinserter block="7"]

Premi qui per scaricare il PDF