Programmazione e Laboratorio di Programmazione

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Algoritmi e Programmazione Avanzata
Programmazione di Calcolatori
Programmazione di Calcolatori
void binario(int n); …………………
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.
Unità Didattica 3 Linguaggio C
Programmazione di Calcolatori
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.
Passaggio di parametri per indirizzo
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.
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
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.
Il linguaggio C Puntatori e dintorni.
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Gestione della memoria
Introduzione al linguaggio C
Struct, enum, Puntatori e Array dinamici
Tutorato Elementi di Informatica 2013
I FILES AD ACCESSO SEQUENZIALE
Ambienti di Programmazione per il Software di Base
Vettori dinamici Definiremo la classe vector.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C Strutture Dati e Puntatori
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
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Le stringhe in C++ Laboratorio 26 Aprile Dott. Serena Villata
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
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
Passaggio di parametri per indirizzo
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Array e Stringhe Linguaggio C.
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 e Laboratorio di Programmazione Lezione X Definizione di vettori a run-time Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Definizione statica di vettori espressione intera costante Definizione: tipoVett nomeVett [dimVett] Modifiche allo stato della memoria: sizeof(tipoVett) dimVett * sizeof(tipoVett) tipoVett *nomeVett Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

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

Definizione di vettori a run-time Modifiche allo stato della memoria: tipoVett *nomeVett /* definizione del "nome" del vettore */ tipoVett *nomeVett; /* allocazione della memoria per il vettore */ nomeVett= (tipoVett *) malloc(dimVett*sizeof(tipoVett)); dimVett * sizeof(tipoVett) Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: I/O di vettori /* sorgente: VettIO.c */ /* programma che illustra le modalita' di definizione di un vettore ** a run-time */ /* 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, unsigned int dim) { /* definizione della variabile per la scansione del vettore */ int pos; /* scansione del vettore e acquisizione del suo contenuto */ for (pos = 0; pos < dim; pos++) printf("\nVett[%d]? ", pos); scanf("%d", Vett+pos); }; } continua … Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: I/O di vettori Continua … /* funzione per la restituzione del contenuto di un vettore di interi */ void ResVettInt(int *Vett, unsigned int dim) { /* definizione della variabile per la scansione del vettore */ int pos; /* scansione del vettore e restituzione del suo contenuto */ for (pos = 0; pos < dim; pos++) printf("\nVett[%d]: %d", pos, *(Vett+pos)); } /* funzione per l’allocazione di un buffer la cui dimensione è espressa ** in numero di interi */ int * AllBuffInt(unsigned int dim) /* definizione della variabile per l’indirizzo iniziale del buffer */ int *ptr; /* allocazione della memoria per il buffer */ ptr = (int *) malloc(dim * sizeof(int)); /* se l’allocazione e’ andata a buon fine restituisce l’indirizzo di ** inizio del buffer; NULL altrimenti */ return(ptr); Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: I/O di vettori Continua … /* Chiamante */ int main() { /* definzione del "nome" del vettore */ int * prova; /* definizione e inizializzazione della dimensione del vettore */ unsigned int dim; printf("\nDimensione del vettore? "); scanf("%u", &dim); /* allocazione della memoria necessaria */ 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 e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: I/O di vettori Continua … /* rilascia la memoria allocata per il vettore e termina */ free(prova); return(1); } Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori /* sorgente: 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 e tipi di interesse generale */ #include <stdlib.h> ** di funzioni e tipi per la gestione delle stringhe e della memoria */ #include <string.h> Continua … Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori Continua … /* funzione per l'acquisizione del contenuto di un vettore di interi */ void AcqVettInt(int *Vett, unsigned int dim) { /* definizione della variabile per la scansione del vettore */ int pos; /* scansione del vettore e acquisizione del suo contenuto */ for (pos = 0; pos < dim; pos++) printf("\nVett[%d]? ", pos); scanf("%d", Vett+pos); }; } /* funzione per la restituzione del contenuto di un vettore di interi */ void ResVettInt(int *Vett, unsigned int dim) /* definisce la variabile per la scansione del vettore */ unsigned int pos; /* scansione del vettore e restituzione del suo contenuto */ printf("\nVett[%d]: %d", pos, *(Vett+pos)); Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori Continua … /* funzione per l’allocazione di un buffer la cui dimensione è espressa ** in numero di interi */ int * AllBuffInt(unsigned int dim) { /* definizione della variabile per l’indirizzo iniziale del buffer */ int *ptr; /* allocazione della memoria per il buffer */ ptr = (int *) malloc(dim * sizeof(int)); /* se l’allocazione e’ andata a buon fine restituisce l’indirizzo di ** inizio del buffer; NULL altrimenti */ return(ptr); } Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori Continua … /* funzione che concatena due vettori di interi in un terzo vettore */ int *ConcVettInt(int *sorg1, unsigned int dim1, int *sorg2, unsigned int dim2) { /* definizione del "nome" del vettore destinazione */ 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 il I vettore sorgente in testa al vettore destinazione */ memcpy ((void *) result, (void *) sorg1, dim1*sizeof(int)); /* copia il II vettore sorgente in coda al I nel vettore destinazione */ memcpy ((void *) (result+dim1), (void *) sorg2, dim2*sizeof(int)); /* restituisce l'indirizzo del vettore risultante */ } Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori Continua … /* Chiamante */ int main() { /* definizione delle variabili per i "nomi" dei tre vettori */ int *src1, *src2, *trg; /* definizione delle variabili per la dimensione dei due vettori sorgente */ unsigned int dim_src1, dim_src2; /* acquisizione della dimensione del I vettore sorgente */ printf("\nDimensione del I vettore? "); scanf("%u", &dim_src1); /* allocazionezione della 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 e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori Continua … /* acquisiszione della dimensione del II vettore sorgente */ printf("\nDimensione del II vettore? "); scanf("%u", &dim_src2); /* allocazione della 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); }; /* acquisizione del contenuto dei due vettori sorgente */ printf("\nAcquisizione del I vettore"); AcqVettInt(src1, dim_src1); printf("\nAcquisizione del II vettore"); AcqVettInt(src2, dim_src2); /* concatenazione dei 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 vettore destinazione negativo"); free(src2); }; Continua … Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time

Esempio: concatenazione di vettori Continua … /* restituzione del contenuto del vettore destinazione */ printf("\nContenuto del vettore destinazione:"); ResVettInt(trg, dim_src1+dim_src2); /* recupero della memoria allocata per i tre vettori */ free(src1); free(src2); free(trg); return(1); } Programmazione e Laboratorio di Programmazione: Definizione di vettori a run-time