Strutture Dati Dinamiche

Documenti analoghi
I puntatori e l allocazione dinamica di memoria

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

4 GLI ARRAY E LE STRINGHE

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Lezione 9: Strutture e allocazione dinamica della memoria

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

Input/output in C e in C++

La gestione della memoria

Fondamenti di Informatica T. Linguaggio C: i puntatori

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

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

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Laboratorio di Algoritmi e Strutture Dati. La gestione della memoria dinamica Heap

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

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

Procedura operativa per la gestione della funzione di formazione classi prime

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Gestione di files Motivazioni

Ingegneria del Software

Programmazione Orientata agli Oggetti in Linguaggio Java

Un puntatore è una variabile che contiene l indirizzo di una variabile. Una variabile di tipo puntatore è dichiarata tramite il costruttore di tipo *

Ministero della Salute

Fondamenti di Programmazione

Laboratorio di Informatica L-A 1. ne: M se macchina, P se parte Nel caso di macchina seguono: L identificatore

Laboratorio di Programmazione Lezione 1. Cristian Del Fabbro

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

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

STRINGHE: ARRAY DI CARATTERI! a p e \0

Java Native Interface Appunti

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

ACCESS. Database: archivio elettronico, dotato di un programma di interfaccia che facilita la registrazione e la ricerca dei dati.

La programmazione nel linguaggio C

3. Terza esercitazione autoguidata: progetto gestione voli

Il calcolatore. Architettura di un calcolatore (Hardware)

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

Esercitazione 4. Comandi iterativi for, while, do-while

Esonero del corso di Programmazione a Oggetti

Allocazione dinamica della memoria - riepilogo

Problem solving elementare su dati vettoriali

COSTRUZIONE DI UN APPLICAZIONE

Lezione 4. Sommario. L artimetica binaria: I numeri relativi e frazionari. I numeri relativi I numeri frazionari

UD4 - MATLAB. M-file. Efficienza degli algoritmi. Formati d uscita

Manuale del software Supplemento. Comunicazione tra sensore per rilevamento oggetti O2D2xx e Siemens Simatic S / / 2011

Struttura dati FILE. Concetto di FILE

Valutazione del personale

VERIFICA MATRICOLE e STAMPA CERTIFICATO INTEGRATIVO DI GARANZIA

PROGRAMMI LINGUAGGIO C

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

Lezione 3 Progettazione di siti

Lettura e scrittura di file di dati input/output

Sono file di caratteri, organizzati in linee. Ogni linea e` terminata da una marca di fine linea (newline, cara ttere '\n').

(1) (2) (3) (4) 11 nessuno/a (1) (2) (3) (4) X è il minore tra A e B nessuno/a X è sempre uguale ad A X è il maggiore tra A e B

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

ARCHITETTURA FISICA DEL SISTEMA

Introduzione alla programmazione in C

Specifiche tecniche e di formato Presentazione comunicazione unica per la nascita d impresa

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

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Lavoro & Previdenza La circolare su temi previdenziali e giuslavoristici

Informatica Medica C++ Informatica Medica I semestre Docenti: Fabio Solari e Manuela Chessa. Sviluppo di un applicazione eseguibile

SQL Server Architettura Client-Server. SQL Server Introduzione all uso di SQL Server Dutto Riccardo.

Programma Richiesta riproduzione RFID versione 1.0

Modalità di registrazione al Portale della Pubblica Amministrazione

Algebra di Boole Algebra di Boole

1 Automi Cellulari (Rev )

DOTT. ING. LEONARDO RIGUTINI DIPARTIMENTO INGEGNERIA DELL INFORMAZIONE UNIVERSITÀ DI SIENA VIA ROMA SIENA UFF

puntatori Lab. Calc. AA 2007/08 1

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

Compito di Fondamenti di Informatica

Integrazione al Manuale Utente 1

XML e Windows Phone. Semplice tutorial per l'utilizzo di documenti e dati XML in un'app per Windows Phone.

ISCRIZIONI ON LINE Registrazione delle famiglie. Direzione generale per gli studi, la statistica e i sistemi informativi

PIANO DI LAVORO. a.s / 2016

Progettazione di Algoritmi

Manuale cliente finale portale accertamenti delibera 40

(1) - - (4) R4 = R7 * R7 (4) (2) (3) 5 - (4) rinviata perché in WAW con (3) 6 (3) e (4) ritirabili ma attendono il completamento di (2) (2) (3) (4)

Progetto NoiPA per la gestione giuridicoeconomica del personale delle Aziende e degli Enti del Servizio Sanitario della Regione Lazio

Esercizio 1. Esercizio 2

Risoluzione di problemi ingegneristici con Excel

ATTENZIONE! Per completare la procedura di accesso è indispensabile eseguire la sincronizzazione del Token (vedi punto 1.10).

Matematica con il foglio di calcolo

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

Il comando provoca il salvataggio dello stato e la terminazione dell esecuzione.

Manuale Utente. La Tavola B invece riporta il dettaglio dei vincoli presenti e consente di sapere quali vincoli operano in una determinata locazione.

Gestione delle eccezioni in Java

ALLEGATO: ISTRUZIONI PER L OPERATORE DI SEDE PER ACQUISIRE LE DOMANDE TELEMATICHE DI RICONGIUNZIONE

Grammatica di base: Pointers

Il linguaggio SQL: query innestate

liceo B. Russell PROGRAMMAZIONE INDIRIZZO: SCIENTIFICO SCIENZE APPLICATE TRIENNIO: TERZA DISCIPLINA: INFORMATICA

18/05/2016 MANUALE UTENTE

Gestione dei File. dischi nastri cd

ANAGRAFE NAZIONALE CREDITI FORMATIVI. Manuale utente

Breve riepilogo della puntata precedente:

Il file system. Le caratteristiche di file, direttorio e partizione sono del tutto indipendenti dalla natura e dal tipo di dispositivo utilizzato.

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

Linguaggi di Programmazione

Transcript:

Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti a tempo di programmazione (non a tempo di esecuzione!) Mentre per le variabili di tipo scalare o primitivo ciò non costituisce un problema, può essere limitativo per variabili di tipo strutturato (es., struct, stringhe, vettori) per le quali talvolta non è possibile sapere a priori la quantità di dati in ingresso da dover memorizzare Per superare la rigidità della dichiarazione statica, occorre un modo per chiedere al sistema nuova memoria quando c è bisogno Questo è possibile grazie al concetto di allocazione dinamica Programmazione - Michele Colajanni, 2006/2007 491

Allocazione dinamica in C Molti linguaggi, ma non tutti, consentono di chiedere nuova memoria quando c è bisogno A tale scopo, il linguaggio C utilizza una primitiva di sistema che invia la richiesta al sistema operativo: funzione di libreria malloc() Questa funzione opera sulla memoria HEAP... Code segment Data segment HEAP STACK... Programmazione - Michele Colajanni, 2006/2007 492 La funzione malloc(): Funzione malloc() Chiede al sistema di allocare un area di memoria grande quanto richiesto dal programmatore Se l allocazione è stata possibile, restituisce l indirizzo dell area di memoria allocata Se l allocazione non è stata possibile, restituisce un puntatore con valore NULL (cioè 0) Appartiene alla standard library, per cui si può utilizzare solo dopo aver indicato nel programma: #include <stdlib.h> Programmazione - Michele Colajanni, 2006/2007 493

Funzione malloc() In pratica, per usare la funzione malloc() bisogna: specificare la dimensione dell area di memoria desiderata (in byte) utilizzare un puntatore per memorizzare l indirizzo restituito da malloc() L area allocata può essere utilizzata mediante il puntatore Poiché malloc() restituisce un indirizzo puro, è indispensabile un casting per etichettare l area di memoria come contenente dati di un certo tipo ESEMPIO (allocare 12 byte) int *p; p = (int *) malloc(12); p Programmazione - Michele Colajanni, 2006/2007 494 Problema Quante variabili int alloca l istruzione: p = (int *) malloc(12); Dipende! Da cosa? Dall architettura e compilatore utilizzato? Infatti, la dimensione dei tipi non è standard. Quindi, 12 byte potrebbero contenere: 6 int in un compilatore che utilizzi int da 2 byte 3 int nel caso di un compilatore che usi int da 4 byte MORALE: Per la portabilità dei programmi, come parametro di malloc() conviene non utilizzare mai valori numerici assoluti! Programmazione - Michele Colajanni, 2006/2007 495

Soluzione: Uso della funzione sizeof() Due tipi di applicazione: sizeof(<espressione>) Es., char str[8]; sizeof(str[8]); Restituisce la quantità di memoria (in char o byte) necessaria per memorizzare <espressione> sizeof(<tipo di dato T>) Restituisce la quantità di memoria Es., sizeof(int); richiesta (in char o byte) per memorizzare valori di tipo T Programmazione - Michele Colajanni, 2006/2007 496 Uso della funzione sizeof() in combinazione con malloc() Per allocare 7 variabili di tipo int int *p; p = (int *) malloc(7*sizeof(int)); Risultato dell allocazione per int che occupano 4 byte: 28 byte p Risultato dell allocazione per int che occupano 2 byte: 14 byte p Programmazione - Michele Colajanni, 2006/2007 497

Attenzione A differenza della memoria occupata dal record di attivazione nella memoria stack, l area di memoria allocata dinamicamente in una funzione sopravvive alla funzione che l ha allocata fino a quando non viene deallocata esplicitamente Sopravvive = Tempo di vita Visibilità E un errore frequente far riferimento ad una struttura dati che è stata già deallocata Se c è necessità di muoversi all interno delle locazioni di memoria allocate nell HEAP, usare un altra variabile e NON MODIFICARE quella restituita dalla malloc() Programmazione - Michele Colajanni, 2006/2007 498 Come si rilascia la memoria dinamica La memoria dinamica allocata nella memoria HEAP: rimane allocata fino a quando non viene deallocata quindi va rilasciata esplicitamente Infatti, nel linguaggio C non vi sono garbage collector ( spazzini ) come in altri linguaggi, tipo Java e Perl L area di memoria allocata dinamicamente deve essere rilasciata mediante la funzione free(p) Programmazione - Michele Colajanni, 2006/2007 499

Utilizzo della memoria dinamica int *p; p = (int *) malloc(7*sizeof(int)); L area di memoria è usabile tramite il puntatore: o tramite la notazione *p o tramite la notazione p[i] che infatti sono sempre equivalenti Quindi, in pratica si è creato nell HEAP un vettore di 7 int nella memoria dinamica HEAP: p Programmazione - Michele Colajanni, 2006/2007 500 Memoria dinamica e Memoria statica Che differenza c è tra le seguenti dichiarazioni? int *pdin; pdin = (int *) malloc(7*sizeof(int)); int pstat[7]; Nell utilizzo? NESSUNA DIFFERENZA Nella dichiarazione? DIFFERENZA SOSTANZIALE: Nel caso di memoria dinamica, la dimensione 7 può essere sostituita da una variabile Programmazione - Michele Colajanni, 2006/2007 501?

Esempio #include <stdio.h> #include <stdlib.h> main() { int vector[15]; /* spazio per 15 interi */ int *dynvect; /* spazio per il puntatore al vettore dinamico */ int k, i; printf("inserire la dimensione desiderata del vettore\n"); scanf( %d, &k); dynvect = (int *) malloc(k * sizeof(int)); /* ora è possibile usare liberamente sia vector sia dynvect come vettori, lunghi 15 e k, rispettivamente */ for (i=0;i<k;i++) dynvect[i] = i*i; /* i primi k quadrati */ for (i=0;i<15;i++) vector[i] = 2*i; /* i primi 15 numeri pari */ free(dynvect); Programmazione - Michele Colajanni, 2006/2007 502 Allocazione dinamica E possibile allocare memoria dinamica per qualsiasi struttura dati Vettore (già visto) Singola variabile (non si usa, ma è possibile): p = (int *) malloc(sizeof(int)); Stringa Struct Programmazione - Michele Colajanni, 2006/2007 503

Allocazione stringa dinamica Stringa di 10 caratteri: char *str; str = (char *) malloc(11*sizeof(char)); Stringa di dimensione definita da input: char *str; int dim; scanf( %d, &dim); str = (char *) malloc(dim*sizeof(char)); NOTA: Come nel caso del vettore, non vi è differenza nell utilizzo della stringa Programmazione - Michele Colajanni, 2006/2007 504 Struct: Allocazione struct dinamica struct persona { char nome_cognome[41]; ; char codice_fiscale[17]; float stipendio; typedef struct persona Persona; Persona *t, *t10; t = (Persona *) malloc(sizeof(persona)); t10 = (Persona *) malloc(10*sizeof(persona)); Programmazione - Michele Colajanni, 2006/2007 505

Utilizzare i campi delle struct dinamiche Vi sono 3 modi per riferirsi agli elementi di una struct dinamica: Operatori di dereferenziamento: * e [] Operatore di puntatore a struct: -> Nel caso dell esempio precedente, le seguenti modalità sono equivalenti: (*t).stipendio = 2354.38; t -> stipendio = 2354.38; Modalità più corretta Programmazione - Michele Colajanni, 2006/2007 506 Esercizio 1 (Specifica) Scrivere un programma che utilizzi una funzione per leggere da input un certo numero di valori int e li inserisca in un vettore allocato dinamicamente dalla funzione stessa. La funzione deve restituire al main() il puntatore al vettore dinamico creato Programmazione - Michele Colajanni, 2006/2007 507

Esercizio 1 (Algoritmo della funzione) E necessario chiedere in input il numero di valori che si vogliono inserire Si dichiara un vettore dinamico della dimensione richiesta Si scandisce tutto il vettore, inserendo elemento per elemento Esercizio 1 (Rappresentazione informazioni) Serve un puntatore a int sia nella funzione sia nel main() Serve una variabile int per memorizzare la dimensione presa da input Serve un int come indice per scandire il vettore Programmazione - Michele Colajanni, 2006/2007 508 #include <stdio.h> #include <stdlib.h> int* creavett(void); Esercizio 1 (Programma) main() Non si sa quanti elementi abbia il vettore. { int *pv; Il main() e altre eventuali funzioni non possono pv= creavett(); utilizzare il vettore senza sapere la dimensione. free(pv); int* creavett(void) { int *v, num, i; printf( Quanti valori? ); scanf( %d, &num); v = (int *) malloc(num*sizeof(int)); for (i=0; i<num; i++) { printf( v[%d]=, i); scanf( %d, &v[i]); /* o anche: scanf( %d, v+i); */ return(v); Programmazione - Michele Colajanni, 2006/2007 509

#include <stdio.h> #include <stdlib.h> Esercizio 2 (Programma) int* creavett(int *); main() { int *pv; int dim, i, neg=0; pv= creavett(&dim); for (i=0; i<dim; i++) { if (pv[i]<0) neg++; free(pv); int* creavett(int *num) { int *v, i; printf( Quanti valori? ); scanf( %d, num); v = (int *) malloc(*num * sizeof(int)); for (i=0; i<*num; i++) { printf( v[%d]=, i); scanf( %d, &v[i]); return(v); Versione che riporti la dimensione del vettore mediante un parametro (passato per riferimento). In questo modo, il main() può usare il vettore per calcolare, per esempio, il numero degli elementi negativi. Programmazione - Michele Colajanni, 2006/2007 510 Esercizio 2bis (Programma) #include <stdio.h> #include <stdlib.h> void creavett(int **, int *); main() { int *pv; int dim, neg=0; creavett(&pv, &dim); for (i=0; i<dim; i++) { if pv[i]<0 neg++; free(pv); void creavett(int **pvett, int *num) { int i; printf( Quanti valori? ); scanf( %d, num); *pvett = (int *) malloc(*num * sizeof(int)); for (i=0; i<*num; i++) { printf( v[%d]=, i); scanf( %d, *pvett Versione con due parametri che riportino sia il vettore sia la sua dimensione. La funzione deve restituire il vettore attraverso un parametro passato per riferimento. Poiché il tipo del vettore è un puntatore a int (cioè, int *), il tipo del parametro è un puntatore a puntatore a int Programmazione - Michele Colajanni, 2006/2007 511

Esempio 3 (per esercizio) Scrivere una funzione vett_copy() che, dato un vettore di interi, ne crei un altro uguale, copiando in quest ultimo il contenuto del primo. Programmazione - Michele Colajanni, 2006/2007 512 Esercizio 3 void vett_copy(int* v1, int num, int** pv2) { int i; *pv2 = (int*) malloc(num * sizeof(int)); for (i=0; i<num; i++) (*pv2)[i] = v1[i]; main() { int vettore[] = {20,10,40,50,30; int* newvet = NULL; vcopy(vettore, 5, &newvet); free(newvet); Programmazione - Michele Colajanni, 2006/2007 513

Riepilogo Ingredienti fondamentali per la gestione della memoria dinamica: Funzione malloc() Funzione free() Variabile puntatore Ingredienti necessari per la gestione della memoria dinamica: Funzione sizeof() Operatore di casting Programmazione - Michele Colajanni, 2006/2007 514