Programmazione di Calcolatori

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Vettori A. Stefanel - Vettori.
Uso avanzato di C.
Puntatori in C e C++.
Stringhe di caratteri In linguaggio C.
PUNTATORI Introduzione
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.
Introduzione al linguaggio C
Fondamenti di Informatica Prof. Cantone
Algoritmi in C++ (1) da completare
Caratteri e stringhe di caratteri
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.
Process synchronization
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 VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
memoria gestita staticamente:
Esercizio: Copiare un file in un nuovo file mediante le funzioni read e write.
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Le liste dinamiche La ricorsione
Le funzioni.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XII Le funzioni Programmazione di Calcolatori: le funzioni 1.
Programmazione di Calcolatori
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XI Gli operatori Programmazione di Calcolatori: gli operatori 1.
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione X Ingresso/Uscita di Interi Programmazione di Calcolatori: Ingresso/Uscita 1.
Unità Didattica 3 Linguaggio C
Programmazione di Calcolatori
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.
C. Gaibisso Programmazione di Calcolatori Lezione XIV I vettori Programmazione di Calcolatori: i vettori 1.
Programmazione di Calcolatori
C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
Esercizi su File e Liste
Grafi Rappresentazione mediante liste di adiacenza:
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
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.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
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.
1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me ,
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

Programmazione di Calcolatori Lezione XVII Allocazione dinamica di vettori Programmazione di Calcolatori: allocazione dinamica di vettori

Allocazione statica di vettori espressione intera costante Definizione: tipoVett nomeVett [dimVett] Modifiche allo stato della memoria: sizeof(tipoVett) dimVett * sizeof(tipoVett) tipoVett *nomeVett Programmazione di Calcolatori: allocazione dinamica di vettori

Allocazione statica di vettori Problemi: - non riesco a gestire situazioni nelle quali la dimensione del vettore è nota a run-time non riesco a gestire situazioni nelle quali la dimensione del vettore varia a run-time Soluzione: riprodurre le modifiche allo stato della memoria “innescate” dalla definizione statica di un vettore attraverso le funzioni di allocazione dinamica rese disponibili dal C Programmazione di Calcolatori: allocazione dinamica di vettori

Allocazione dinamica di vettori Modifiche allo stato della memoria: tipoVett *nomeVett // definisce la variabile per l’indirizzo del // buffer tipoVett *nomeVett; // alloca la memoria per il buffer e ne memorizza // l’indirizzo nell’apposita variabile nomeVett= (tipoVett *) malloc(dimVett*sizeof(tipoVett)); dimVett * sizeof(tipoVett) Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: I/O di vettori // sorgente: Lezione_XVII\VettIO.c // programma che illustra le modalita' di allocazione dinamica // di un vettore // inclusione del file di intestazione della libreria standard // che contiene definizioni di macro, costanti e dichiarazioni // di funzioni e tipi funzionali alle varie operazioni di I/O #include <stdio.h> // di funzioni di interesse generale #include <stdlib.h> // funzione per l'acquisizione del contenuto di un vettore di interi void AcqVettInt(int *Vett, size_t dim) { // definisce la variabile per la scansione del vettore size_t pos; // scandisce il vettore e ne acquisisce il contenuto for (pos = 0; pos < dim; pos++) printf("\nVett[%d]? ", pos); scanf("%d", Vett+pos); }; continua … Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: I/O di vettori continua … // funzione per la restituzione del contenuto di un vettore di interi void ResVettInt(int *Vett, size_t dim) { // definisce la variabile per la scansione del vettore size_t pos; // scandisce il vettore e ne restituisce il contenuto for (pos = 0; pos < dim; pos++) printf("\nVett[%d]: %d", pos, *(Vett+pos)); }; // funzione che alloca il buffer per un dato numero di interi int * AllBuffInt(size_t dim) // definisce la variabile per l’indirizzo del buffer int *ptr; // alloca memoria per il buffer ptr = (int *) malloc(dim * sizeof(int)); // se l’allocazione e’ andata a buon fine restituisce // l’indirizzo del buffer; NULL altrimenti return(ptr); Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: I/O di vettori continua … // Chiamante int main() { // definisce la variabile per l’indirizzo del vettore int * prova; // definisce e inizializza la variabile per la dimensione del vettore size_t dim; printf("\nDimensione del vettore? "); scanf("%u", &dim); // alloca la memoria per il vettore if ((prova = AllBuffInt(dim)) == NULL) // se l'allocazione fallisce, termina printf("\nEsito dell'allocazione negativo"); return(0); }; // altrimenti, acquisisce e restituisce il contenuto del vettore printf("\nEsito dell'allocazione positivo"); printf("\nAcquisizione del contenuto del vettore\n"); AcqVettInt(prova, dim); printf("\nRestituzione del contenuto del vettore"); ResVettInt(prova, dim); Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: I/O di vettori continua … // rilascia la memoria allocata per il vettore e termina free(prova); return(1); } Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: I/O di vettori Compilazione: Esecuzione: Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori // sorgente: Lezione_XVII\VettConc.c // Programma che acquisisce due vettori di interi (sorgenti) , la cui // dimensione e’ nota a run-time, per concatenarli in un terzo vettore // (destinazione) // inclusione del file di intestazione della libreria standard // che contiene definizioni di macro, costanti e dichiarazioni // di funzioni e tipi funzionali alle varie operazioni di I/O #include <stdio.h> // di funzioni di interesse generale #include <stdlib.h> // funzione per l'acquisizione del contenuto di un vettore di interi void AcqVettInt(int *Vett, size_t dim) { // definisce la variabile per la scansione del vettore size_t pos; // scandisce il vettore e ne acquisisce il contenuto for (pos = 0; pos < dim; pos++) printf("\nVett[%d]? ", pos); scanf("%d", Vett+pos); }; Continua … Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori Continua … // funzione per la restituzione del contenuto di un vettore di interi void ResVettInt(int *Vett, size_t dim) { // definisce la variabile per la scansione del vettore size_t pos; // scandisce il vettore e ne restituisce il contenuto for (pos = 0; pos < dim; pos++) printf("\nVett[%d]: %d", pos, *(Vett+pos)); }; // funzione che alloca il buffer per dim interi int * AllBuffInt(size_t dim) // definisce la variabile per l’indirizzo del buffer int *ptr; // alloca memoria per il buffer ptr = (int *) malloc(dim * sizeof(int)); // se l’allocazione e’ andata a buon fine restituisce // l’indirizzo del buffer; NULL altrimenti return(ptr); Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori Continua … // funzione che copia nro_val valori da src in dst void CopiaVettInt (int* src, int* dst, size_t nro_val) { // definisce un cursore int curs; // copia dalla sorgente alla destinazione nro_val valori for(curs = 0; curs < nro_val; curs++) dst[curs] = src[curs]; }; // funzione che concatena due vettori di interi in un terzo vettore int *ConcVettInt(int *vett1, size_t dim1, int *vett2, size_t dim2) // definisce la variabile per il vettore risultante int *result; // alloca la memoria per il vettore risultante if ((result = AllBuffInt(dim1+dim2)) == NULL) // se l'allocazione non ha esito positivo restituisce NULL return(result); // copia il contenuto del I vettore sorgente in testa al vettore // destinazione CopiaVettInt(vett1, result, dim1); Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori Continua … // copia il II vettore sorgente in coda al I nel vettore destinazione CopiaVettInt(vett2, result+dim1, dim2); // restituisce l'indirizzo del vettore risultante return(result); }; // Chiamante int main() { // definisce le variabili per gli indirizzi dei tre vettori int *src1, *src2, *trg; // definisce le variabili per la dimensione dei due vettori sorgente size_t dim_src1, dim_src2; // acquisisce la dimensione del I vettore sorgente printf("\nDimensione del I vettore? "); scanf("%u", &dim_src1); // alloca la memoria per il I vettore sorgente if ((src1 = AllBuffInt(dim_src1)) == NULL) // se l'allocazione fallisce, termina printf("\nEsito dell'allocazione del I sorgente negativo"); return(0); Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori Continua … // acquisisce la dimensione del II vettore sorgente printf("\nDimensione del II vettore? "); scanf("%u", &dim_src2); // alloca la memoria per il II vettore sorgente if ((src2 = AllBuffInt(dim_src2)) == NULL) { // se l'allocazione fallisce, rilascia la memoria per il I vettore e termina printf("\nEsito dell'allocazione del II sorgente negativo"); free(src1); return(0); }; // acquisisce il contenuto dei due vettori sorgente printf("\nAcquisizione del I vettore"); AcqVettInt(src1, dim_src1); printf("\nAcquisizione del II vettore"); AcqVettInt(src2, dim_src2); // concatena i vettori sorgente nel vettore destinazione: se l’esito è // negativo rilascia la memoria allocata per i sorgenti e termina if ((trg = ConcVettInt(src1, dim_src1, src2, dim_src2)) == NULL) printf("\nEsito dell'allocazione del target negativo"); free(src2); Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori Continua … // restituisce il contenuto del vettore destinazione printf("\nContenuto del vettore risultante:"); ResVettInt(trg, dim_src1+dim_src2); // rilascia la memoria allocata per i tre vettori free(src1); free(src2); free(trg); return(1); } Programmazione di Calcolatori: allocazione dinamica di vettori

Esempio: concatenazione di vettori Compilazione: Esecuzione: Programmazione di Calcolatori: allocazione dinamica di vettori