Algoritmi e Programmazione Avanzata

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
INFORMATICA Tipi strutturati
Puntatori in C e C++.
Array (vettori) In linguaggio C / C++.
PUNTATORI Introduzione
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Un nuovo tipo di dati Gli array.
Puntatori e Heap in C Prof.Ing.S.Cavalieri.
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.
Corso di Fondamenti di programmazione a.a.2009/2010
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 -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
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.
Process synchronization
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 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 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.
APPUNTI SUL LINGUAGGIO C
Array Struttura numerate di dati. Memorizzare molti dati In informatica cè spesso bisogno di memorizzare ed elaborare un insieme costituito da molti dati.
Selezione (=scelta) con “if-else”
Puntatori - Cenni Nicola Fanizzi Corso di Programmazione C.d.L. in Informatica DIB - Università degli Studi di Bari.
Lab. Calc. AA 2005/061 puntatori. Lab. Calc. AA 2005/062 Attributi di un oggetto nome o identificatore; tipo o classe; valore o valori; indirizzo;
1 laboratorio di calcolo II AA 2003/04 seconda settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Organizzazione della Memoria (Unix) Text contiene le istruzioni in linguaggio macchina del codice eseguibile, può essere condiviso in caso di processi.
Programmazione modulare nel linguaggio C
Alberi di ricerca binari
Algoritmi e Programmazione Avanzata
Lezione 24 maggio 2007 Strutture File Allocazione dinamica della memoria.
AN FI Array Array in Java. AN FI Array Dichiarazione di array in Java [ ]; //oppure u [] ; int a[]; int[] a; u La dimensione non è specificata.
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
Fondamenti di informatica Linguaggio C Main Program: Architettura di un PC Diagrammi di flusso Linguaggio C.
Programmazione di Calcolatori
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Puntatori e gestione dinamica della memoria
Unità Didattica 3 Linguaggio C
Passaggio di parametri per indirizzo
Ricerca sequenziale in un array di interi
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.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
GLI ARRAY MONODIMENSIONALI. Utilizzando le nostre attuali conoscenze, proviamo a risolvere il seguente problema: Calcolare la media dei voti conseguiti.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Istruzioni per.
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 M.MezzalamaM. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Mezzalama - M. Rebaudengo SOTTOSISTEMA DI MEMORIA.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Vettori (a una dimensione)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Istruzioni per.
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.
© Piero Demichelis Tipi strutturati I tipi considerati finora hanno la caratteristica comune di non essere strutturati: ogni elemento è una singola entità.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Istruzioni per.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
Relazione sulle strutture dati Svolta da: Buccella Simone Strutture di dati Aree di memoria Puntatore numericibooleani alfabetici Statici dinamici Puntatori.
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.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Transcript della presentazione:

Algoritmi e Programmazione Avanzata L'allocazione dinamica della memoria Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Pile e code

I puntatori Le variabili di tipo puntatore permettono di accedere alla memoria in modo indiretto. a Memoria principale int a; … a=10; Memoria principale a p int a; int *p; … p=&a; *p=10; A.A. 2004/2005 APA - Memoria dinamica

Operatori * e & L’operatore & permette di risalire dal nome di una variabile al suo puntatore: p = &a; L’operatore * permette di accedere alla cella di memoria referenziata da una variabile puntatore: *p = 10; A.A. 2004/2005 APA - Memoria dinamica

Operazioni sui puntatori Assegnazione: p = q; /* con un altro puntatore */ p = NULL; /* con la costante NULL */ Incremento/decremento p = p+5; p = p-10; p++; Se p è un puntatore ad intero, dopo l'istruzione p punta all'intero posto 5 interi dopo in memoria. A.A. 2004/2005 APA - Memoria dinamica

Uso dei puntatori Scansione e azzeramento di un vettore … int vett[N]; int *p; p=&vett[0]; for (i=0; i<N; i++) *p++=0; A.A. 2004/2005 APA - Memoria dinamica

p->nome_campo  (*p).nome_campo Puntatori a struct Qualora una variabile p sia di tipo puntatore a struct, ad essa è applicabile l'operatore ->: p->nome_campo  (*p).nome_campo A.A. 2004/2005 APA - Memoria dinamica

Esempio Equivale a (*p).codice=0; struct scheda{ int codice; char nome[20]; char cognome[20]; }; struct scheda *p; struct scheda vett[N]; … p=&vett[0]; for (i=0; i<N, i**) { p->codice=0; p++; } Equivale a (*p).codice=0; A.A. 2004/2005 APA - Memoria dinamica

Puntatori e vettori In C il nome di una variabile di tipo vettore coincide con il puntatore al primo elemento del vettore. Quindi puntatori e nomi di vettori sono intercambiabili. A.A. 2004/2005 APA - Memoria dinamica

Esempio Definizioni: int vett[MAX]; int *p; Inizializzazione: p = vett;  p=&vett[0]; Forme equivalenti: vett[0]=10;  *p=10; vett[10]=25;  *(p+10)=25; vett[i]=0;  *(p+i)=0; *vett=27;  p[0]=27; *(vett+3)=0;  p[3]=0; A.A. 2004/2005 APA - Memoria dinamica

Allocazione statica La memoria necessaria per le variabili globali in C resta occupata dal momento dell’attivazione del programma sino al suo termine. Inoltre non è possibile dimensionare tale memoria secondo le esigenze della singola attivazione. Si parla quindi di allocazione statica della memoria. A.A. 2004/2005 APA - Memoria dinamica

Quindi in ogni caso vett occupa 42.000 byte. vett è dimensionato per eccesso, in modo da poter soddisfare in ogni caso le esigenze del programma, anche se questo usa un numero minore di elementi. Quindi in ogni caso vett occupa 42.000 byte. Esempio #define MAX 1000 struct scheda vett[MAX]; A.A. 2004/2005 APA - Memoria dinamica

Esempio Memoria principale vett A.A. 2004/2005 APA - Memoria dinamica

Allocazione dinamica Molti linguaggi di alto livello supportano l’allocazione dinamica della memoria. Questo significa che il programmatore può inserire nel proprio codice delle chiamate a procedure di sistema che richiedono l’allocazione di un’area di memoria richiedono il rilascio di un’area di memoria. A.A. 2004/2005 APA - Memoria dinamica

Situazione 1 Il programma è in grado di determinare, ogni volta che è lanciato, di quanta memoria ha bisogno. Viene allora chiamata una procedura di sistema, che provvede all’allocazione della memoria necessaria. A.A. 2004/2005 APA - Memoria dinamica

Caso 2: il programma ha bisogno di molta memoria Situazione 1 Memoria principale vett Memoria principale Caso 2: il programma ha bisogno di molta memoria vett Caso 1: il programma ha bisogno di poca memoria A.A. 2004/2005 APA - Memoria dinamica

Situazione 2 Durante l’esecuzione, il programma ha bisogno di una quantità variabile di memoria. Il programma usa ad ogni istante solo la memoria di cui ha bisogno, provvedendo periodicamente ad allocare o deallocare memoria. In tal modo si permette ad eventuali altri processi che lavorano in parallelo sullo stesso sistema di meglio utilizzare la memoria disponibile. A.A. 2004/2005 APA - Memoria dinamica

Situazione 2 t vett vett vett vett vett allocazione iniziale deallocazione allocazione deallocazione A.A. 2004/2005 APA - Memoria dinamica

malloc Il C fornisce una procedura di libreria che permette di allocare dinamicamente la memoria necessaria. void *malloc (int n); La procedura richiede al sistema operativo l’allocazione di una zona di memoria di dimensione (in byte) pari ad n, e ritorna il puntatore all’inizio della zona. A.A. 2004/2005 APA - Memoria dinamica

Esempio Richiede l’allocazione di una zona di memoria di n byte. int *punt; int n; … punt = (int *)malloc(n); if (punt == NULL) { printf (“Errore di allocazione\n”); exit(); } Trasforma il puntatore generico ritornato da malloc in un puntatore a int. Verifica che l’allocazione sia avvenuta regolarmente. A.A. 2004/2005 APA - Memoria dinamica

Puntatori e malloc Si può quindi: Allocare un vettore in modo dinamico, tramite la procedura malloc Usare il puntatore ritornato per accedere al vettore, come si farebbe con il nome di un vettore. A.A. 2004/2005 APA - Memoria dinamica

Esempio Si vuole scrivere una procedura alloca che Legge da tastiera un numero n Alloca un vettore di n elementi di tipo struct scheda Inizializza ogni elemento del vettore. A.A. 2004/2005 APA - Memoria dinamica

Procedura alloca int n; /* variabile globale */ … struct scheda *alloca (void) { int i; struct scheda *p; scanf("%d", &n); p=(struct scheda *)malloc(n*sizeof(struct scheda)); if (p==NULL) return (NULL); for (i=0; i<n; i++) { p[i].codice=0; strcpy(p[i].nome, ""); strcpy(p[i].cognome, ""); } return (p); A.A. 2004/2005 APA - Memoria dinamica

Allocazione dinamica di stringhe In C le stringhe sono memorizzate sotto forma di vettori di caratteri, usando '\0' come carattere di fine stringa. Quando si deve memorizzare una stringa di n caratteri si può quindi Usare un vettore allocato staticamente di lunghezza N>n oppure Allocare dinamicamente un vettore di lunghezza n+1 byte. A.A. 2004/2005 APA - Memoria dinamica

Esempio Si vuole scrivere una procedura read che legge da tastiera i dati relativi ad n schede, e li memorizza nel vettore precedentemente allocato. A.A. 2004/2005 APA - Memoria dinamica

Nuova definizione di struct struct scheda{ int codice; char *nome; char *cognome; }; I campi nome e cognome diventano puntatori. A.A. 2004/2005 APA - Memoria dinamica

Procedura read int read (struct scheda *p) { int i, val; char nome[MAX], cogn[MAX]; for (i=0, i<n; i++) { scanf ("%d %s %s\n", &val, nome, cogn); p[i].codice=val; p[i].nome=strdup(nome); if (p[i].nome == NULL) return (-1); p[i].cogn=strdup(cogn); if (p[i].cogn == NULL) } return (0); A.A. 2004/2005 APA - Memoria dinamica

Procedura strdup char *strdup (char *str) { int len; char *p; len=strlen (str); p=(char *)malloc((len+1)*sizeof(char)); if (p==NULL) return (NULL); strcpy (p, str); return (p); } A.A. 2004/2005 APA - Memoria dinamica

Struttura dati 127 25 312 2 pippo pluto paperino clarabella topolino minnie 2 paperone gastone A.A. 2004/2005 APA - Memoria dinamica

Deallocazione Quando si desidera deallocare una zona di memoria, si usa la procedura di sistema free: void free (void *); La procedura free rende libera la zona di memoria puntata dal parametro, che deve essere stata precedentemente allocata con una chiamata a malloc. A.A. 2004/2005 APA - Memoria dinamica

Esempio Si vuole scrivere una procedura libera, che dealloca il vettore di n strutture passato come parametro. È necessario deallocare anche la memoria usata per le stringhe. A.A. 2004/2005 APA - Memoria dinamica

Procedura libera void libera (struct scheda *p) { int i; for (i=0; i<n; i++) { free (p[i].nome); free (p[i].cogn); } free (p); A.A. 2004/2005 APA - Memoria dinamica

Procedura libera (vers. 2) void libera (struct scheda *p) { int i; struct scheda *q; q=p; for (i=0; i<n; i++) { free (q->nome); free (q->cogn); q++; } free (p); A.A. 2004/2005 APA - Memoria dinamica