La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Prof. Fabrizio Camuso – www.camuso.itversione 1.0 Gennaio 2012 Puntatori e gestione dinamica della RAM.

Presentazioni simili


Presentazione sul tema: "Prof. Fabrizio Camuso – www.camuso.itversione 1.0 Gennaio 2012 Puntatori e gestione dinamica della RAM."— Transcript della presentazione:

1 prof. Fabrizio Camuso – 1.0 Gennaio 2012 Puntatori e gestione dinamica della RAM

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

3 prof. Fabrizio Camuso – 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)

4 prof. Fabrizio Camuso – 1.0 Gennaio – 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 Limiti della allocazione statica della RAM (array)

5 prof. Fabrizio Camuso – 1.0 Gennaio – 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() Limiti della allocazione statica della RAM (array)

6 prof. Fabrizio Camuso – 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 lindirizzo di inizio del blocco prenotato (problema: dove memorizzarlo?) NB: se non cè abbastanza memoria malloc() restituisce null

7 prof. Fabrizio Camuso – 1.0 Gennaio 2012 malloc(1000) 1000 byte riservati! RAM … 0x19AF2 Il sistema trova spazio a partire dallindirizzo 0x19AF2 Per scrivere e leggere in questi 1000 byte il programmatore ha bisogno di memorizzare lindirizzo in una variabile. int, float e double non vanno bene Esiste il tipo apposito reference (puntatore)

8 prof. Fabrizio Camuso – 1.0 Gennaio 2012 char* pChar; 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; 1000 byte riservati! RAM … 0x19AF2

9 prof. Fabrizio Camuso – 1.0 Gennaio 2012 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 … 1000 byte riservati! RAM … 0x19AF2

10 prof. Fabrizio Camuso – 1.0 Gennaio 2012 char* pChar=NULL; Situazione prima di aver memorizzato un indirizzo valido in pChar: pChar RAM 0123…0123… NULL

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

12 prof. Fabrizio Camuso – 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? 1000 byte riservati! RAM … 0x19AF2 ?

13 prof. Fabrizio Camuso – 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) RAM 0123…0123…

14 prof. Fabrizio Camuso – 1.0 Gennaio 2012 A RAM … 0x19AF2 Utilizzo della RAM allocata 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 lindirizzo della variabile char! Un puntatore. CORRETTO *pChar = A

15 prof. Fabrizio Camuso – 1.0 Gennaio 2012 A RAM … 0x19AF2 Utilizzo della RAM allocata *puntatore fa passare dallindirizzo allarea puntata dallindirizzo cout << Dammi un carattere; cin >> *pChar; cout << Hai inserito << *pchar; Insomma, basta ricordarsi nelluso di mettere davanti sempre lasterisco…

16 prof. Fabrizio Camuso – 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;

17 prof. Fabrizio Camuso – 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

18 prof. Fabrizio Camuso – 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;

19 prof. Fabrizio Camuso – 1.0 Gennaio 2012 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?? 10 p E questi ??

20 prof. Fabrizio Camuso – 1.0 Gennaio 2012 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] 10 p E questi ?? *p oppure p[0]

21 prof. Fabrizio Camuso – 1.0 Gennaio 2012 Puntatori a VETTORI 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] …

22 prof. Fabrizio Camuso – 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)

23 prof. Fabrizio Camuso – 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 lindirizzo di inizio del vettore! 10-5… p ???

24 prof. Fabrizio Camuso – 1.0 Gennaio 2012 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 10-5… p temp++ temp

25 prof. Fabrizio Camuso – 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 …

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

27 prof. Fabrizio Camuso – 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

28 prof. Fabrizio Camuso – 1.0 Gennaio 2012 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 lutilizzo del puntatore ?

29 prof. Fabrizio Camuso – 1.0 Gennaio 2012 Puntatori a STRUCT 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 alloggetto puntato, la struct; solo dopo questo passaggio si può usare il punto però … Dobbiamo combinare luso del punto tipico dellaccesso alle variabili delle strutture con luso dellasterisco tipico dei puntatori:

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

31 prof. Fabrizio Camuso – 1.0 Gennaio 2012 Puntatori a STRUCT 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 lespressione a sinistra come un puntatore a struttura e Per i vettori di struct creati dinamicamente invece ci sono meno problemi:

32 prof. Fabrizio Camuso – 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

33 prof. Fabrizio Camuso – 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??

34 prof. Fabrizio Camuso – 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.

35 prof. Fabrizio Camuso – 1.0 Gennaio 2012 Limiti della allocazione statica (array) 2a – molto poco efficiente per operazioni di inserimento abcefghijklmnopqrstuvz spazio libero d parte del vettore da spostare (shift a destra) abcdefghijklmnopqrstuvz

36 prof. Fabrizio Camuso – 1.0 Gennaio 2012 Limiti della allocazione statica (array) 2b – molto poco efficiente per operazioni di cancellazione abcefghijklmnopqrstuvz spazio libero parte del vettore da spostare (shift a sinistra) abcdefghijklmnopqrstuvz


Scaricare ppt "Prof. Fabrizio Camuso – www.camuso.itversione 1.0 Gennaio 2012 Puntatori e gestione dinamica della RAM."

Presentazioni simili


Annunci Google