Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria...

26
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numerici booleani alfabetic i Statici dinamici Puntatori a variabili strut te Memoria statica Heap Puntatore variabile Memoria statica Heap Puntatore variabile statica stack heap Gestione memoria 1 1 A

Transcript of Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria...

Page 1: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Relazione sulle strutture dati

Svolta da: Buccella Simone

Strutture di dati

Aree di memoria

Puntatore

numerici booleani

alfabetici

Statici dinamici

Puntatori a variabili strutturate Memoria statica Heap

Puntatore variabile

Memoria statica Heap

Puntatore variabile

statica stack

heap

Gestione memoria

1

1

A

Page 2: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Strutture di dati

•Le strutture dei dati all´interno di un programma hanno un´importanza notevole in quanto subiscono elaborazioni, trasformazioni cambiando di valore nel loro ciclo di vita

•Le strutture dei dati possono essere classificati in diversi modi a secondo del loro utilizzo

2

A = B + 2

A 2B4

numerici booleani

alfabetici

permanenti

Staticidinamici

uscita

ingressoRichiesta

End

Page 3: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Inserisci numeri

1 2 3 0Ordine inverso

3 2 1

Si effettui la lettura da tastiera di un insieme di numeri terminati con uno 0 e si effettui la loro stampa a video in ordine inverso

Richiesta

Analisi problema

Occorrono 2 operazioni elementari:

- lettura

- visualizzazione

Nasce il problema sulla dichiarazione delle variabili perché non si sa a priori il numero massimo di elementi

Possibili soluzioni

End

Page 4: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Possibili soluzioni

Dimensionare un vettore con un valore molto elevato sperando che sia sufficiente

Limitare il numero massimo di numeri da leggere ponendo cosí un limite

Effettuare elaborazioni parziali tipo creare un vettore di dimensione 100 ed effettuare l´inversione ogni 100 numeri

10 2 3 4 10.000

10 2 3 4 500

10 2 3 100

End

Soluzione ottimale

Page 5: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

La soluzione ideale è quella di creare variabili ogni volta che occorrono e salvare in memoria i dati ogni qualvolta che si inseriscono assegnando loro una certa locazione di memoria, in modo da non creare limiti.

Soluzione

Inserisci numeri

1 2 3 0

123

End

Gestione memoria

Puntatore

Page 6: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Gestione memoria

Allocazione dinamica

Allocazione statica

Consiste nel definire le variabili con nome e dimensione prima dell´inizio dell´esecuzione del programma

Consiste nel definire le variabili al momento opportuno mediante l´utilizzo di una funzione che consente al programma di interagire con il sistema operativo, per conoscere lo spazio di memoria utilizzabile

1

Variabile A locazione 1

A

1?

Quale locazione è

libera

1

A

Locazione 1

End

Aree di memoria

Page 7: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Aree di memoria

La locazione di memoria varia a secondo del tipo di variabile ed è suddivisa in 3 aree

•Memoria statica : è utilizzata per le variabili globali visibile quindi da tutti i sottoprogrammi

•Stack: è utilizzata per memorizzare i dati dei sottoprogrammi e dalle funzioni che man mano vengono mandate in esecuzione

•Heap: è utilizzata per memorizzare le variabili create dinamicamente mediante una particolare funzione (new) che assegna ad esse una determinata locazione di memoria

End

Puntatore

Page 8: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Per allocare le variabili in modo dinamico, il programma deve chiedere al sistema operativo la posizione di memoria libera per essere utilizzata. Queste vengono allocate in maniere sequenziale e la loro posizione è variabile, per cui occorre un qualcosa che associ ad ogni variabile l´indirizzo della loro locazione di memoria. Definiamo quindi il Puntatore un tipo di variabile che contiene l´indirizzo del primo byte di una variabile dinamica.

Puntatore

1?

Quale locazione è

libera

1

A

Locazione 1

1Puntatore

End

Definizione

Inizializzazione

Creazione

Accesso indiretto

Assegnazione

Rilascio della heap

Page 9: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Come tutte le variabili, per definire un puntatore occorre assegnare:

• un nome

• Il tipo della variabile che andrá a puntare

Definizione

double* p_d;

int* p_i;

char* p_c;

float* p_f;C++

type IntegerPointer = ^Integer

var B : ^Integer

Pascal

End

Page 10: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Inizializzazione

Nel momento della definizione, quindi dell´avvio del programma, le variabili di tipo puntatore contengono un indirizzo non significativo, cioè di nessun interesse, oppure il valore 0. Per evitare ambiguitá inizializziamo tale puntatore con una particolare istruzione che assegna al puntatore un valore di indirizzo convenzionale.

C++Pascal

doube p_d = null;

Int* p_i = null;

char p_c = null;

float p_f = null;

IntegerPointer := null;

NIL

PuntatoreMessa a terra

potenziale nullo

End

Page 11: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Creazione

La creazione vera e propria della variabile dinamica, cioè dell´allocazione dello spazio all´interno della heap, avviene durante l´esecuzione del programma nel momento del bisogno. La funzione che permette al sistema di creare lo spazio necessario è new.

double* p_d = new;

int* p_i = new;

Char* p_c = new;

float* p_f = new;C++

new (IntegerPointer);

new (B);

Pascal

Memoria statica Heap

VariabilePuntatore

End

Page 12: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Accesso indiretto

L´accesso indiretto alla variabile dinamica si intende l´operazione che permette di scrivere il contenuto di una variabile dinamica mediante l´utilizzo della variabile puntatore che ne contiene l´indirizzo. Questa operazione prende anche il nome di dereferenziazione

10

Memoria statica Heap

VariabilePuntatore

End

Page 13: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Assegnazione ad una variabile dinamica

Simone

Memoria statica Heap

VariabilePuntatore

int* p_i = new;p_i = 0;

Char* p_c = new;p_c = simone;

C++

new (charPointer);charPoint^:=simone;

new (B);B^:=simone;

Pascal

End

Page 14: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Rilascio della heap al termine dell´utilizzo

La possibilitá di effettuare modifiche al contenuto dei puntatori, puó portare a situazioni indesiderate, facendo assumere a due puntatori lo stesso indirizzo di memoria heap si puó cosí perdere il collegamento con una variabile di memoria provocando:

• ingombro inutile della memoria heap con una variabile che rimarrá per sempre inutilizzata

soluzione

10

VariabilePuntatore

1

10

VariabilePuntatore

2

2

• perdita senza possibilitá di recupero del contenuto della variabile

End

Page 15: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Risoluzione a problemi di variabili del heap

•Per risolvere il problema di ingombro inutile della memoria heap è possibile farlo in due modi:

•Per ovviare al problema di perdita del contenuto della variabile se è necessario, salvare il valore in un´altra variabile dinamica o statica.

Modalitá manuale

Modalitá automatica

2A 2B

End

Page 16: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Modalitá manuale

double* p_d;p_d = dispose;

int* p_ip_i = dispose;

Char* p_c; p_c = dispose

float* p_f ;p_f = dispose;

C++

dispose (IntegerPointer);

dispose (B);

Pascal

La modalitá manuale consiste nel rendere nuovamente disponibile lo spazio di memoria heap quando il dato non serve piú . La funzione che permette al sistema di cancellare lo spazio é dispose.

End

Page 17: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Modalitá automatica

La modalitá automatica detta anche garbage collector, è un processo che si occupa di recuperare le porzioni di memoria heap inutilizzate per metterle a disposizione del programma, effettuando il compattamento delle aree libere e liberando la memoria occupata da variabili non piú utilizzate.

Memoria statica Heap

VariabilePuntatore

9

8

7

6

5

End

Page 18: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Puntatori a variabili strutturate

I puntatori a variabili strutturate hanno le stesse caratteristiche di quelli che puntano a semplici variabili, cambia logicamente la loro definizione.

record data:string nomegiorno[10]int giornoint meseint anno;data* comp;

C++Pascal

type data = record nomegiorno : string[10]; giorno: integer;mese: integer;anno: integer end; var comp:^data;

End

Assegnazione

Creazione

Richiesta

Page 19: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Creazione

record data:string nomegiorno[10]int giornoint meseint anno;data* compleanno;comp = new

C++ Pascal

type data = record nomegiorno : string[10]; giorno: integer;mese: integer;anno: integer end; var compleanno:^data; new (comp);

Memoria statica Heap

VariabilePuntatore

anno

mese

giorno

nome

End

Page 20: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Assegnazione

comp.nomegiorno = lunedicomp.giorno = 21comp.mese = 12comp.anno = 2012

C++Pascal

comp.nomegiorno^:=lunedi; comp.giorno^:=21;comp.mese^:=12;comp.anno^:=2012;

Memoria statica Heap

VariabilePuntatore

2012

12

21

lunedi

End

Page 21: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Inserisci numeri

1 2 3

Ordine crescente3 2 1

Leggere 3 numeri interi e memorizzarli in tre variabili dinamiche. Successivamente, ordinarli in ordine decrescente

Richiesta

Analisi problema

Occorrono operazioni elementari:

- lettura

- confronto

- visualizzazione

Possibile soluzioni

End

Page 22: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Inizio

numero

pmax = numero

pmin >pmax

tempo = pmaxpmax = pminpmin = tempo

pmin = numero

Diagramma

si

numero

End

Page 23: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

numero

pmed = numero

pmed >pmax

tempo = pmaxpmax = pmedpmed = tempo

si

pmed <pmin

tempo = pmedpmed = pminpmin = tempo

si

pmaxpmedpmin

Fine

Diagramma

End

Codifica

Page 24: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

Memoria statica Heap

VariabilePuntatore

pmax

pmed

pmin

Definizione

int* pmax, pmed, pmin; int numero, tempo;

Creazione

pmax = new; pmed = new; pmin = new;

End

Page 25: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

cin >> numero;

pmax = numero; mettiamo in pmax il 1°numero

cin >> numero;

pmin = numero; mettiamo in pmin il 2°numero

If (pmin > pmax)

{ tempo = pmax;

pmax = pmin; confrontiamo i primi 2 numeri

pmin = tempo;}

cin >> numero;

pmed = numero; mettiamo in pmed il 3°numero

If (pmed > pmax)

{ tempo = pmax;

pmax = pmed; confrontiamo il maggiore con il 3° numero

pmed = tempo;}

End

Page 26: Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.

If (pmed < pmin)

{ tempo = pmed;

pmed = pmin; confrontiamo i primi 2 numeri

pmin = tempo;}

cout << pmax; visualizzazione del primo

cout << pmed; visualizzazione del secondo

cout << pmin; visualizzazione del terzo

End