Puntatori e gestione dinamica della RAM

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

I tipi Strutturati.
Uso avanzato di C.
Gestione della memoria centrale
Puntatori in C e C++.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità G1 Dati strutturati.
Dati strutturati C++.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Un nuovo tipo di dati Gli array.
Algoritmi in C++ (1) da completare
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione III Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Introduzione agli stream e alle classi
Heap allocation e garbage collector di Oberon Algoritmo Quick Fit e garbage collector mark and sweep.
memoria gestita staticamente:
Fondamenti di Informatica A - Massimo Bertozzi TIPI DI DATO IN C++ What's in a name? That which we call a rose By any other name would smell as sweet.
Le funzioni a tempo di esecuzione
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 6 (Deitel) I vettori Sommario Introduzione Vettori Dichiarazione di vettori 6.4.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
void binario(int n); …………………
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
LdL - LP1 - lez 11 - ver 6 - aa Linguaggi di programmazione I Stringhe (II) Prof. Luigi Di Lascio Lezione 11.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Il linguaggio C Puntatori e dintorni.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
1. 2 Variabili statiche e dinamiche Un programma è un processo in esecuzione a cui il sistema operativo assegna una certa zona di memoria. Tale zona può.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Vettori (a una dimensione)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
File binari Accesso a file con record di lunghezza costante Struct Persona { Int id; Char nome[50];// nome e cognome Double stipendio; }; Persona dipendente;
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Il linguaggio C Puntatori e dintorni.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
Stringhe Una stringa è un vettore di char con un carattere costante \0 che indica la fine della stringa il terminatore rende differenti gli array di char.
Puntatori in C Un puntatore è una variabile che contiene un indirizzo di memoria. Quando una variabile contiene l’indirizzo di un’altra variabile, si dice.
Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 9 e 10 - Segmenti.
Lezione 9 e 10 - Segmenti di memoria e puntatori - Aritmetica dei puntatori - Formattazione dei dati - Significato ed impiego del cast - Tipi di dato strutturato.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

Puntatori e gestione dinamica della RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Limiti della allocazione statica (array) 1 - SPAZIO ALLOCATO FISSO (gestione non ottimale RAM) prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Limiti della allocazione statica della RAM (array) 1 - GESTIONE NON OTTIMALE DELLA RAM Per alcuni programmi la quantità di RAM effettivamente utilizzata è MOLTO variabile Autocad, Word, PhotoShop, Excel … Usando gli array il programmatore non avrebbe altra possibilità che stare ‘largo’: dimensionarli pensando al caso peggiore (massima richiesta RAM) prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Limiti della allocazione statica della RAM (array) 1 – GESTIONE NON OTTIMALE DELLA RAM Ma questo in ambienti multitask o multiutente significherebbe allocare molta più ram di quella necessaria = Minor numero di programmi che il sistema sarebbe in grado di gestire in contemporanea prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Limiti della allocazione statica della RAM (array) 1 – GESTIONE NON OTTIMALE DELLA RAM Soluzione Un meccanismo per allocare in un certo istante esattamente la quantità di memoria che serve e per restituirla al sistema quando non serve più = puntatori + malloc() + sizeof() + free() prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

malloc() – memory allocation malloc(numero_byte_richiesti) Chiede al s.o. uno spazio contiguo di byte Se la richiesta viene soddisfatta viene restituito l’indirizzo di inizio del blocco ‘prenotato’ (problema: dove memorizzarlo?) NB: se non c’è abbastanza memoria malloc() restituisce null prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

1 2 3 … 0x19AF2 malloc(1000) 1000 byte riservati! Il sistema trova spazio a partire dall’indirizzo 0x19AF2 Per scrivere e leggere in questi 1000 byte il programmatore ha bisogno di memorizzare l’indirizzo in una variabile. int, float e double non vanno bene Esiste il tipo apposito reference (puntatore) RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Più correttamente dovremmo inizializzarla: char* pChar = NULL; pChar (o un qualsiasi altro nome di variabile) viene in questo modo definita come un puntatore a char. Più correttamente dovremmo inizializzarla: char* pChar = NULL; 1 2 3 … 0x19AF2 1000 byte riservati! RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

if (pChar) //se valido … char* pChar=NULL; E’ molto importante che un puntatore che al momento non sta individuando nessun blocco di memoria abbia il valore NULL. Consente un uso sicuro: if (pChar) //se valido … 1 2 3 … 0x19AF2 1000 byte riservati! RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Situazione prima di aver memorizzato un indirizzo valido in pChar: char* pChar=NULL; Situazione prima di aver memorizzato un indirizzo valido in pChar: pChar 1 2 3 … NULL RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

pChar = (char*) malloc (1000); char* pChar=NULL; pChar = (char*) malloc (1000); Situazione dopo aver memorizzato un indirizzo valido in pChar: pChar 1 2 3 … 0x19AF2 *pChar 1000 byte riservati! RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

pChar = (char*) malloc(1000); malloc() ‘non sa’ che tipo di valori verranno memorizzati nel blocco che ha riservato. Il valore restituito è quindi un puntatore ‘generico’ che va bene per qualsiasi cosa. E’ poi il programma che deve specificare come usare il blocco: per char? int? float? una struct? ? 1 2 3 … 0x19AF2 1000 byte riservati! RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

pChar = (char*) malloc(1000); … utilizzo della memoria … free(pChar); pChar = NULL; free restituisce al s.o. il blocco di RAM ed è molto importante marchiare il puntatore come non più valido (NULL) 1 2 3 … RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Utilizzo della RAM allocata 1 2 3 … 0x19AF2 Iniziamo con un caso ancora più semplice: char* pChar = (char*) malloc(1); lo spazio in RAM è sufficiente esattamente per un carattere Come memorizzare ‘A’ in quello spazio? errore classico: pChar = ‘A’; Ci si sta dimenticando che pChar non è una variabile char ma l’indirizzo della variabile char! Un puntatore. CORRETTO *pChar = ‘A’ ‘A’ RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Utilizzo della RAM allocata *puntatore fa passare dall’indirizzo all’area puntata dall’indirizzo cout << “Dammi un carattere”; cin >> *pChar; cout << “Hai inserito “ << *pchar; Insomma, basta ricordarsi nell’uso di mettere davanti sempre l’asterisco… 1 2 3 … 0x19AF2 ‘A’ RAM prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Utilizzo della RAM allocata questo rende evidente la differenza! char* pChar = (char*) malloc(1); *pChar = ‘A’; cout << “Indirizzo: “ << pChar << endl; cout << “Oggetto puntato: “ << *pChar << endl; prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a tipi semplici (int, float ecc.) sizeof(TIPO) p = (int *) malloc( sizeof(int) ); *p = 123; cout << “ - valore: “ << *p; Allo stesso modo si procederebbe con float, double, bool. Ma NON con string prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a tipi semplici sizeof(TIPO) cout << sizeof(char) << endl; cout << sizeof(int) << endl; cout << sizeof(float) << endl; cout << sizeof(double) << endl; prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

*p = 10; //lo accetta? cosa fa?? Puntatori a VETTORI Un vettore di 1000 interi p = (int *) malloc( 1000 * sizeof(int) ); E poi come lo usiamo? *p = 10; //lo accetta? cosa fa?? p 10 E questi ?? prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

DUALITA’ puntatori/vettori Puntatori a VETTORI Un vettore di 1000 interi p = (int *) malloc( 1000 * sizeof(int) ); p[0] = 10; //!! interessante !! DUALITA’ puntatori/vettori *p equivale a p[0] p 10 E questi ?? *p oppure p[0] prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a VETTORI 10 -5 … p = (int *) malloc( 1000 * sizeof(int) ); Ah, beh allora …. p = (int *) malloc( 1000 * sizeof(int) ); p[0] = 10; //!! interessante !! p[1] = -5; p[2] = … Insomma: dichiarazione a parte poi si fa come al solito!! Cicli compresi. 10 -5 … p[0] p[1] … prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a VETTORI Ultima cosa speciale da sapere: i puntatori si possono incrementare ed il risultato è che si spostano in avanti a puntare gli elementi successivi p = (int *) malloc( 1000 * sizeof(int) ); *p = 10; *(p+1) = -5; *(p+2) = … In alcune situazioni torna comodo … 10 -5 … *p *(p+1) … prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a VETTORI Si può anche modificare in modo permanente il valore ma bisogna stare attenti! p = (int *) malloc( 1000 * sizeof(int) ); *p = 10; p++; *p = -5; p++; *p = … Abbiamo perso l’indirizzo di inizio del vettore! 10 -5 … ??? p prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Meglio farlo con una variabile ausiliaria: Puntatori a VETTORI Meglio farlo con una variabile ausiliaria: p = (int *) malloc( 1000 * sizeof(int) ); int* temp = p; //temp è una copia di p *temp = 10; temp++; *temp = -5; temp++; *temp = … p è rimasto ‘al sicuro’ p 10 -5 … temp temp++ prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a STRUCT Le motivazioni addotte per i vettori di variabili semplici valgono, a maggior ragione, per i vettori di struct. Infatti una struct occupa più memoria di una variabile non strutturata . La cattiva gestione che ne conseguirebbe con un uso statico è quindi potenzialmente molto maggiore. Ma c’è un altro motivo … prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a STRUCT Applicazione6 Applicazione1 Sistema Operativo (o altro modulo sw che fornisce servizi) Applicazione5 risposta (return …) Applicazione2 Applicazione4 richiesta Informazioni struct creata al momento distrutta quando non serve più MOLTE!! Applicazione3 temp prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a STRUCT struct poesie { char poeta[40]; char titolo[100]; int anno; } Importante: per creare dinamicamente le struct non possiamo usare il tipo string ma vettori di caratteri; a parte questo rimangono disponibili i soliti meccanismi di input/output con cin e cout: cin/cout riferimento_alla_struct.poeta prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

e l’utilizzo del puntatore ? Puntatori a STRUCT struct poesie { char poeta[40]; char titolo[100]; int anno; } p = (poesie *) malloc( sizeof(poesie) ); tutto molto logico visto che si vuole un puntatore ad un oggetto di tipo poesie e creare spazio per un oggetto dello stesso tipo… e l’utilizzo del puntatore ? prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a STRUCT però … struct poesie { char poeta[40]; Dobbiamo combinare l’uso del punto tipico dell’accesso alle variabili delle strutture con l’uso dell’asterisco tipico dei puntatori: struct poesie { char poeta[40]; char titolo[100]; int anno; } p = (poesie *) malloc( sizeof(poesie) ); (*p).anno = 2005; Le parentesi in (*p) servono perchè altrimenti p. verrebbe trattato come una struct invece di un puntatore a struct. (*p) fa passare dal puntatore all’oggetto puntato, la struct; solo dopo questo passaggio si può usare il punto però … prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Quindi … semplificazione! Puntatori a STRUCT I progettisti del linguaggio si sono resi conto che la doppia sintassi è veramente pesante, tenuto anche in considerazione che l’uso di puntatori a struct è diffusissimo. Quindi … semplificazione! non solo (*p).anno = 2005; ma anche p->anno = 2005; prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Puntatori a STRUCT Per i vettori di struct creati dinamicamente invece ci sono meno problemi: poesie* pPoesieVett = (poesie*) malloc(100 * sizeof(poesie) ); pPoe[4].anno = 2134; o anche: (*(p+4)).anno = 1234; //pesante … (p+4)->anno = 1234; //decisamente meglio! -> tratta in automatico l’espressione a sinistra come un puntatore a struttura e prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Dai sorgenti di Doom3 … void Save( idSaveGame *savefile ) { …savefile->WriteInt( travelFlags ); … } La funzione Save riceve un puntatore (savefile) ad un oggetto idSaveGame, una struct che rappresenta il file su cui salvare il gioco. Con la OOP, che vedremo, una struct può anche contenere funzioni oltre che variabili. Con savefile->WriteInt(…) si sta richiamando il comando WriteInt(…) della struct puntata dal puntatore savefile temp prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Dal sorgente consigliato da Google per usare Maps sui vostri siti con PHP … function GoogleMapAPI($map_id = 'map', $app_id = 'MyMapApp') { $this->map_id = $map_id; $this->sidebar_id = 'sidebar_' . $map_id; $this->app_id = $app_id; } Ora sapete cosa si sta facendo: $this è un puntatore ad oggetto (nella OOP si parla di classi e oggetti al posto di struct e variabili ma è lo stesso concetto) che contiene la variabile map_id. … vuoi vedere che anche per programmare con … servono queste cose?? prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Un esempio di uso di FaceBook sui vostri siti, sempre con PHP class manage { private $entryId; function __construct($entryId) $this->entryId = $entryId; } } … Memoria dinamica, puntatori a struct (oggetti) e OOP servono per tutte le cose più interessanti della programmazione WEB o non WEB. prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Limiti della allocazione statica (array) 2a – molto poco efficiente per operazioni di inserimento a b c e f g h i j k l m n o p q r s t u v z spazio libero d parte del vettore da spostare (shift a destra) a b c d e f g h i j k l m n o p q r s t u v z prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012

Limiti della allocazione statica (array) 2b – molto poco efficiente per operazioni di cancellazione a b c d e f g h i j k l m n o p q r s t u v z spazio libero parte del vettore da spostare (shift a sinistra) a b c e f g h i j k l m n o p q r s t u v z prof. Fabrizio Camuso – www.camuso.it versione 1.0 Gennaio 2012