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



Documenti analoghi
Funzioni in C. Violetta Lonati

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

I puntatori e l allocazione dinamica di memoria

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Allocazione dinamica della memoria - riepilogo

INFORMATICA 1 L. Mezzalira

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

Introduzione alla programmazione in C

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

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

costruttori e distruttori

FONDAMENTI di INFORMATICA L. Mezzalira

Introduzione al linguaggio C Gli array

Funzioni. Il modello console. Interfaccia in modalità console

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

puntatori Lab. Calc. AA 2007/08 1

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

Introduzione al Linguaggio C

Codifica: dal diagramma a blocchi al linguaggio C++

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Concetto di Funzione e Procedura METODI in Java

INTRODUZIONE, LINGUAGGIO, HANDS ON. Giuseppe Cirillo

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

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

Gestione dei File in C

GESTIONE INFORMATICA DEI DATI AZIENDALI

Inizializzazione, Assegnamento e Distruzione di Classi

Linguaggio C. Fondamenti. Struttura di un programma.

La gestione della memoria

Corso di Informatica

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Compilatore risorse display grafico LCD serie IEC-line


Cosa è un foglio elettronico

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

dall argomento argomento della malloc()

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

Lezione 10: Librerie e compilazione separata

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

FUNZIONI. La libreria standard del C fornisce una ricca collezione di funzioni, come le funzioni:

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Alcune regole di base per scrivere un programma in linguaggio C

LINGUAGGI DI PROGRAMMAZIONE

Esercizio: gestione di un conto corrente

Programmazione I - Laboratorio

VARIABILI LOCALI E GLOBALI (ESTERNE)

Sistema operativo: Gestione della memoria

ZZZ01 Esercizi Vari. Esercizi per preparazione alla prova pratica di laboratorio

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

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Dispensa YACC: generalità

Le variabili. Olga Scotti

Linguaggio C - Funzioni

DevC++ vers Manuale d uso

Linguaggio C Compilazione, linking e preprocessor

Arduino: Programmazione

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

Dispensa di Informatica I.1

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

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

Linguaggio C - Stringhe

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Java: Compilatore e Interprete

Calcolare il massimo di una lista

Esercizio 1. Esercizio 1

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

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

Fondamenti di Informatica 2

Politecnico di Torino

Database. Si ringrazia Marco Bertini per le slides

Esercitazione n 4. Obiettivi

La struttura dati ad albero binario

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

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

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

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 13 File Binari

Dispensa di database Access

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

Struttura di un programma Java

Progettazione : Design Pattern Creazionali

Il tipo di dato astratto Pila

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

NOZIONI BASE PER ESERCITAZIONI

COMPILAZIONE DI UN APPLICAZIONE. 1) Compilare il file (o i file se più d uno) che contengono il testo del programma. compilatore

Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file

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

Esercitazione E7 Immagini

Librerie. Laboratorio di Informatica Antonio Monteleone 28

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Il Software e Il Sistema Operativo. Prof. Francesco Accarino IIS Altiero Spinelli A.S. 09/10

Lezione 8. La macchina universale

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 02 Tipi semplici in C

Variabili e tipi di dato

Transcript:

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli Studi di Bologna Anno Accademico 2008/2009 Sommario Progetti su più file Funzioni come parametro Parametri del main

Librerie Programmi con molte funzioni richiedono una organizzazione su più file. Strutture dati e codice che appartengono a uno stesso contesto vengono di solito raggruppate a formare librerie. Il codice di una libreria è contenuto in uno o più file. Esempi: il codice di molte funzioni di libreria per l input/output (printf, scanf,... ) è contenuto in un file chiamato stdio.c funzioni per la gestione dinamica della memoria (malloc, free,... ) libreria stdlib.c funzioni matematiche (cosh, sqrt, exp,... ) libreria math.c etc. Anche voi potete generare una libreria. Esempi: le funzioni del tipo di dato astratto List le funzioni e strutture dati per la simulazione di un dispositivo meccanico i simboli che indicano i valori massimi/minimi di certe variabili Dichiarazione vs. definizione La strutturazione su più file è una questione di manutenzione del codice, non di funzionalità. Un programma su più file deve poter essere compilato come se fosse su un file solo La separazione tra dichiarazione e definizione aiuta. La dichiarazione (tipi, funzioni, macro, variabili globali) fornisce una specifica di un componente può essere duplicata senza problemi non genera codice macchina quando viene compilata nota: si possono dichiarare anche variabili globali (extern). La definizione (costanti, variabili, funzioni) non può essere duplicata associa un identificatore a qualcosa che ha un riscontro fisico (posizione in memoria di dati o codice) produce codice macchina in fase di compilazione

Progetti su più file Bisogna sempre seguire due regole: 1. Definire o anche solo dichiarare gli identificatori prima dell utilizzo 2. Mai duplicare definizioni di identificatori. I file sorgente hanno l estensione.c, e contengono codice (definizioni di funzioni) dati (definizioni di variabili) La testa di un file sorgente (header) contiene quindi tipicamente una serie di dichiarazioni/definizioni (regola 1.) Il codice compilato a partire dai sorgenti viene messo assieme tramite il linker. Notate che il codice della funzione main() sarà un uno solo dei file sorgenti che vogliamo collegare (regola 2.). Progetti su più file Immaginiamo il seguente scenario: il sorgente di una libreria di funzioni è in un file "funz.c"; in particolare, in funz.c definisce una funzione f(); voglio utilizzare f() nel main(); il main() è definito all interno di un altro sorgente, chiamato "main.c". Cosa devo fare? Per la regola 1., se main.c chiama una funzione f() definita in funz.c, è necessario che f() sia stata definita o dichiarata prima di quando viene usata (all interno di main.c). Per la regola 2., f() non può essere ridefinita. Quindi, main.c deve contenere la dichiarazione di f(), ma non la definizione.

Header file La soluzione che si adotta di solito è questa: Quando si implementa una libreria, si scrive anche un blocco (header) che contiene tutte le dichiarazioni di tutti gli identificatori messi a disposizione dalla libreria comprese le interfacce di tutte le funzioni, le dichiarazioni di tipo, etc. L header viene poi copiato, tale e quale, in cima a tutti gli altri file sorgenti che utilizzano almeno una funzione di tale libreria. Per fortuna, non è necessario fare copia-incolla a mano... Esiste il pre-processore. Grazie al pre-processore, è possibile scrivere gli header in file separati (header file), che vengono poi inclusi in cima ai vari sorgenti.c, ove ce ne fosse bisogno. Per convenzione, gli header file hanno estensione.h (es., stdio.h, stdlib.h, math.h, mio_header.h... ) Il pre-processore Il pre-processore interviene prima del compilatore. Non genera codice macchina. Serve a operare delle sostituzioni sintattiche. Riscrive il programma sorgente in un nuovo programma C, che non contiene più istruzioni per il pre-processore (e che può essere quindi compilato). Le istruzioni per il pre-processore sono precedute da # Alcune utili istruzioni per il pre-processore: #define symbol translation per definire MACRO #include <header.h> per includere header di libreria del C (quelli che si trovano in una cartella nota all installazione del compilatore) #include "header.h" per includere i propri header (che si trovano in una cartella locale)

Funzione qsort Una funzione di libreria molto utile è la funzione qsort, dichiarata in stdlib.h. Implementa l ordinamento degli elementi di un vettore. Il tipo degli elementi del vettore può essere qualsiasi! Come è possibile? La funzione qsort implementa un algoritmo generale All interno di questo algoritmo, qsort chiama una funzione compare che effettua il confronto Parametrizzando la funzione compare è possibile applicare l algoritmo generale a casi specifici. Alcuni esempi: vettore di interi allora, x viene prima di y se x < y. vettore di stringhe allora, x viene prima di y se strcmp(x,y)< 0. Funzione qsort La funzione compare è passata alla funzione qsort come parametro. L interfaccia di qsort infatti è: void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) ); Dal manuale: The qsort() function sorts buf (which contains num items, each of size size) using Quicksort. The compare function is used to compare the items in buf. compare should return negative if the first argument is less than the second, zero if they are equal, and positive if the first argument is greater than the second. qsort() sorts buf in ascending order.

Funzione qsort L interfaccia di qsort è: void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) ); Notate come viene definito il parametro formale compare: int (*compare)(const void *, const void *) indica che: compare è una funzione (perché seguita da parentesi tonde) che ha due parametri di tipo puntatore i quali puntano a dati che non vengono modificati da compare e restituisce un valore di tipo int in pratica, ne definisce l interfaccia. Funzione qsort Una possibile funzione che implementa questa interfaccia è la seguente: int cmp_int( void* a, void* b ) { return ( *( int* )a )-( *( int* )b ); } cmp_int si può utilizzare come funzione di confronto per ordinare un vettore di interi. main() { int V[100];... qsort(v, 100, sizeof( int ), cmp_int ); } Nota: per verificare quanti confronti effettua qsort, è possibile definire un contatore all interno di cmp_int Si può ricorrere a una variabile static. Un altra funzione con un parametro funzione è bsearch().

Parametri del main Anche il main() ha dei parametri, che corrispondono a quelli inseriti nella riga di comando. Ad esempio, se l eseguibile prodotto dalla compilazione è prog.exe, da riga di comando posso ordinare (al S.O.) l esecuzione di prog.exe con dei parametri: prog.exe par1 2 -v "ultimo parametro" I parametri possono essere utilizzati dall interno del main() Vengono inseriti in un vettore, chiamato argv, che è un parametro formale del main() La dimensione logica di argv è un altro parametro formale del main(): argc. Parametri del main prog.exe par1 2 -v "ultimo parametro" Per utilizzare argc e argv, bisogna indicare esplicitamente argc e argv come parametri formali del main(): main( int argc, char *argv[] ) {... printf( "primo parametro: %s", argv[1] ); } Da notare due cose; argv è un vettore di stringhe. Il primo elemento di argv è il nome stesso dell eseguibile. Se prog.exe viene invocato come nell esempio, si ha: argv contiene prog.exe, par1, 2, -v, ultimo parametro; argv[0] vale prog.exe; argc vale 5; argv[4] vale ultimo parametro.