dall argomento argomento della malloc()



Documenti analoghi
Allocazione dinamica

I puntatori e l allocazione dinamica di memoria

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

Funzioni in C. Violetta Lonati

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Allocazione dinamica della memoria - riepilogo

Il tipo di dato astratto Pila

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Funzioni. Il modello console. Interfaccia in modalità console

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Inizializzazione, Assegnamento e Distruzione di Classi

Compito di Fondamenti di Informatica

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

puntatori Lab. Calc. AA 2007/08 1

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Laboratorio di programmazione

GESTIONE INFORMATICA DEI DATI AZIENDALI

Protezione. Protezione. Protezione. Obiettivi della protezione

Visibilità dei Membri di una Classe

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Introduzione agli Abstract Data Type (ADT)

costruttori e distruttori

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

La gestione della memoria

Sistemi Operativi mod. B. Sistemi Operativi mod. B A B C A B C P P P P P P < P 1, >

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO XI.2015

Variabili e tipi di dato

Utilizzo delle formule in Excel

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)


Concetto di Funzione e Procedura METODI in Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Problem solving elementare su dati vettoriali

Algoritmi su array / 2

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

CONCETTO DI ANNIDAMENTO

La struttura dati ad albero binario

Corso di Fondamenti di Informatica Algoritmi su array / 2

Introduzione al linguaggio C Gli array

Oggetti Lezione 3. aspetti generali e definizione di classi I

Soluzione dell esercizio del 2 Febbraio 2004

Realizzazione di una classe con un associazione

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

strutturare dati e codice

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Vettori Algoritmi elementari di ordinamento

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Capitolo 13. Interrogare una base di dati

3. La sintassi di Java

Tipi di Dato Ricorsivi

Le variabili. Olga Scotti

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Programmazione ad Oggetti. Java Parte I

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Monitor. Introduzione. Struttura di un TDA Monitor

Richiesta pagina PHP (es: index.php)

Lezione 9: Strutture e allocazione dinamica della memoria

Abstract Data Type (ADT)

Programmazione a Oggetti Lezione 10. Ereditarieta

Introduzione. Coordinazione Distribuita. Ordinamento degli eventi. Realizzazione di. Mutua Esclusione Distribuita (DME)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Laboratorio di Algoritmi e Strutture Dati

Introduzione alla teoria dei database relazionali. Come progettare un database

Comunicazione. La comunicazione point to point e' la funzionalita' di comunicazione fondamentale disponibile in MPI

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Dispensa di database Access

Programmazione I - Laboratorio

CAPITOLO 7 - SCAMBIO DI MESSAGGI

Introduzione a Classi e Oggetti

Esercizio 1. Esercizio 1

LISTE, INSIEMI, ALBERI E RICORSIONE

CREARE UNA LIBRERIA IN C

Lezione 8. La macchina universale

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Testi di Esercizi e Quesiti 1

Matematica in laboratorio

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Riferimenti ed Oggetti

INFORMATICA 1 L. Mezzalira

Esercizi su. Funzioni

Introduzione al MATLAB c Parte 2

Gestione Risorse Umane Web

Utilizzo e scrittura di classi

Transcript:

Allocazione dinamica Quando? Tutte le volte in cui i dati possono crescere in modo non prevedibile staticamente a tempo di sviluppo Un array con dimensione i fissata a compile-time non è sufficiente È necessario avere più controllo sull allocazione di memoria Allocazione della memoria by need malloc() Allocazione tramite la funzione: void* malloc(size_t dim); Il valore di ritorno è un puntatore senza tipo (void* void*) un indirizzo all inizio di un area di memoria la cui dimensione è definita dall argomento argomento della malloc() Il sistema ricorda, per ogni singola allocazione, quanta memoria è stata allocata Attenzione al void* Può essere trasformato tramite cast in qualsiasi tipo di puntatore anche in un tipo la cui dimensione non corrisponde al tipo allocato PERICOLOSISSIMO! 1 2 free() Deallocazione tramite la procedura: void free(void* p); Il sistema sa quanta memoria deallocare per quel puntatore (ricorda la relativa malloc) Se la memoria non viene correttamente deallocata memory leaking In caso di strutture dati condivise, come si decide quando deallocare la memoria? In ogni momento occorre sapere chi ha in uso una certa struttura condivisa per deallocare solamente quando più nessuno ne ha un riferimento 3 Garbage Collection Nei moderni linguaggi gg di programmazione, la deallocazione della memoria non è più un problema Esistono sistemi automatici di recupero della memoria allocata ma non più usata allocazione esplicita, deallocazione automatica Il sistema sa sempre quanti e quali puntatori puntano ad una certa area di memoria quando un area di memoria non è più puntata da nessuno, viene recuperata tramite opportuna deallocazione 4

Reference Counting Nel nostro piccolo si può ipotizzare di utilizzare un semplice sistema di gestione della memoria, il reference counting... Basato sul conteggio semiautomatico del numero di puntatori che puntano ad una certa struttura dati Ogni volta che un nuovo puntatore punta alla struttura dati, incremento di reference count per quella struttura Ogni volta che un puntatore smette di puntare alla struttura dati, decremento di reference count per quella struttura In ogni momento si ha il controllo sul numero di puntatori che puntano alla struttura dati se tale numero è maggiore di zero, la struttura non è puntata da nessuno e quindi è possibile deallocarla Per fare funzionare il tutto è necessaria MASSIMA DISCIPLINA... 5 Reference Counting Come implementare un meccanismo di reference counting? Predisporre una struttura dati globale che rappresenti una tabella di due colonne e n (quante?) righe Nella prima colonna sono memorizzati gli indirizzi puri delle aree di memoria allocate Nella seconda colonna sono memorizzati i reference count rilasciati Per completare il tutto servono tre funzioni/procedure: Una per allocare la memoria e impostare a uno il reference count Una per copiare un puntatore in un altro incrementando conteggio relativo a un indirizzo dato Una per eliminare un riferimento decrementando conteggio relativo a un indirizzo dato 6 Reference Counting Com è implementata la tabella? Com è implementata la ricerca nella tabella?...e ele regole di utilizzo? L interfaccia: void* referencemalloc (size_t size); void* copyreference(void* p); void releasereference(void *p); e l implementazione? Gli esercizi precedenti Come cambiano gli esercizi passati se si tiene conto della possibilità di allocare la memoria in modo dinamico? Merge Sort Calcolo determinante Rubrica facciamo le cose con ordine UN PREMIO PER L IMPLEMENTAZIONE MIGLIORE! 7 8

ADT Abstract Data Type Specifica un insieme di dati e un insieme di operazioni applicabili a tali dati Astratto funzionalmente indipendente dalle varie possibili implementazioni i i Le operazioni applicabili sono l interfaccia dell ADT Un ADT può essere implementato t in vari modi pur mantenendo la stessa interfaccia L interfaccia fornisce un costruttore, che restituisce un handle astratto, e varie operazioni, rappresentate come funzioni che accettano come argomento tale handle astratto tt handle è di solito un puntatore a qualcosa ADT Abstract Data Type ADT è rappresentato da un interfaccia, che nasconde l implementazione l i corrispondente Gli utenti di un ADT utilizzano solo l interfaccia ma non accedono (almeno non dovrebbero) direttamente all implementazione poiché questa in futuro può cambiare Tutto ciò è basato sul principio di information hiding, ovvero proteggere i clienti da decisioni di design che in futuro possono cambiare La potenza del concetto di ADT sta nel fatto che l implementazione l i è nascosta al cliente: viene resa pubblica solo l interfaccia Questo significa che un ADT può essere implementato in vari modi ma, finché non viene cambiata l interfaccia, i programmi che lo utilizzano non devono essere alterati 9 10 Matrici come ADT Definire handle (tipo di base) Definire costruttore (e distruttore ) Definire i operazioni i typedef double Element; typedef struct DynMatrixStruct Element* matrix; DynMatrix è un puntatore ad int rows, cols; una struttura da allocare dinamicamente che contiene *DynMatrix; una matrice da allocare dinamicamente i 11 Costruttore Alloca la memoria necessaria, inizializza i dati in modo opportuno e restituisce i un puntatore t a handle DynMatrix newdynmatrix(int rows, int cols) DynMatrix dm = (DynMatrix) malloc(sizeof(struct struct DynMatrixStruct)); if (dm == NULL) return NULL; dm->matrix = (Element*)malloc(sizeof(Element)*rows*cols); if (dm->matrix == NULL) return NULL; dm->rows = rows; dm->cols = cols; return dm; 12

Distruttore Per deallocare un DynMatrix è sufficiente scrivere free(adynmatrix)? Evidentemente no: occorre prima deallocare la matrice, poi la struttura contenitore occorre una procedura che lo sappia fare void destroydynmatrix(dynmatrix m) free(m->matrix); free(m); Operazioni Data una DynMatrix: Verifica dei bound data una coppia di valori (riga, colonna) verificarne la validità Recupero numero di righe Recupero numero di colonne Recupero di un elemento Assegnamento di un elemento altre funzioni non primitive 13 14 Operazioni interfaccia boolean checkbounds(dynmatrix m, int row, int col); int getrowcount(dynmatrix m); int getcolcount(dynmatrix nmatri m); Element getmatrixelement(dynmatrix m, int row, int col); Verifica dei bound boolean checkbounds(dynmatrix m, int row, int col) return row >= 0 && col >= 0 && row < m->rows && col < m->cols; void setmatrixelement(dynmatrix m, int row, int col, Element value); 15 16

Dimensioni int getrowcount(dynmatrix m) return m->rows; int getcolcount(dynmatrix m) return m->cols; Funzioni accessorie Consentono di leggere o impostare un elemento della matrice date riga e colonna Element getmatrixelement(dynmatrix i m, int row, int col) assert(checkbounds(m, row, col)); return *(m->matrix + row * m->cols + col); void setmatrixelement(dynmatrix m, int row, int col, Element value) assert(checkbounds(m, ( row, col)); *(m->matrix + row * m->cols + col) = value; 17 18 Chi è assert? È una macro (per il preprocessore) p che prende come argomento un valore booleano Tipicamente tale valore è il risultato del calcolo di una espressione Se il valore è vero, nessun problema, se è falso, stampa su stderr un messaggio d errore (normalmente l espressione) e termina (abort() abort()) l applicazione Può essere utile e comodo per verificare le precondizioni sull invocazione di una funzione/procedura 19 Cosa sono le precondizioni? Le precondizioni sono condizioni sugli argomenti di una funzione/procedura che devono essere rispettate t affinché l invocazione di tale funzione/procedura vada a buon fine Dovrebbe essere il chiamante ad assicurarsi che le precondizioni (che fanno parte dell interfaccia) siano rispettate A livello di chiamato si può (si dovrebbe) verificare che le precondizioni siano verificate e, se non lo sono, terminare brutalmente l applicazione non è possibile proseguire Servono A garantire che l applicazione non prosegua nell esecuzione se non ci sono le condizioni affinché questa possa lavorare correttamente Ad aiutare lo sviluppatore ad individuare eventuali bug 20

Stampa void printmatrice_dyn(dynmatrix t i M t i m) int row, col; char format[10] = ""; strcat(format, ELEMENTFORMAT); strcat(format, "\t"); //Minimizzare il numero di spazi for (row = 0; row < getrowcount(m); row++) for (col = 0; col < getcolcount(m); col++) printf(format, getmatrixelement(m, row, col)); ); printf("\n"); n"); printf("\n"); n"); 21 Estrazione Minore DynMatrix estraiminore_dyn(dynmatrix m, int elrow, int elcolumn) int row, col; DynMatrix minore; assert(getrowcount(m) == getcolcount(m)); //matrice quadrata assert(checkbounds checkbounds(m, elrow, elcolumn)); l minore = newdynmatrix(getrowcount(m) - 1, getcolcount(m) - 1); for (row = 0; row < getrowcount(m); row++) int rowminor = (row < elrow)? row : row - 1; for (col = 0; col < getcolcount(m); col++) if (row!= elrow && col!= elcolumn) l int colminor = col < elcolumn? col : col - 1; setmatrixelement(minore, rowminor, colminor, getmatrixelement(m, row, col)); return minore; 22 Determinante Element determinante_dyn(dynmatrix m) int riga = 0, colonna; assert(getrowcount(m) == getcolcount(m)); //matrice quadrata if (getrowcount(m) == 2) return getmatrixelement(m, t t( 0, 0) * getmatrixelement(m, t t( 1, 1) - getmatrixelement(m, 0, 1) * getmatrixelement(m, 1, 0); else Element det = 0; for (colonna = 0; colonna < getcolcount(m) (m); colonna++) DynMatrix minore; Element detminore; minore = estraiminore_dyn(m, riga, colonna); printmatrice_dyn(minore); detminore = determinante_dyn(minore); dyn(minore); det += getmatrixelement(m, riga, colonna) * (colonna % 2 == 0? detminore : -detminore); destroydynmatrix(minore); return det; 23 Domandone! one! In tutte le funzioni di ADT di DynMatrix tranne che sulla newdynmatrix manca una precondizione su un argomento; quale? 24

Rispostone! one! L unico argomento non verificato è quello di tipo DynMatrix Se tale argomento è un puntatore non valido (== NULL), non si può lavorare e se è un puntatore non valido e diverso da NULL? purtroppo non è possibile verificare che un indirizzo assegnato ad un puntatore punti ad un area di memoria valida 25