Programmazione I - Laboratorio

Documenti analoghi
Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file

Esercitazione. Uso di funzioni e librerie di funzioni

Perché il linguaggio C?

Primo passo: il preprocessor. Il preprocessore. Esempi di direttive al preprocessore: #include. Esempi di direttive al preprocessore: #define

STRUTTURA DI UN PROGRAMMA

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

Compilazione e Makefile

Compilazione separata

Preprocessore, linker e libreria standard

Primi passi col linguaggio C

Il preprocessore. Direttiva define Direttiva include Direttiva if

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali

Programmazione I - Laboratorio

Linea di comando. Compilazione. Aprire una shell di DOS tramite:

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

Cenni sul preprocessore e il suo utilizzo

Le direttive del Preprocessore

Introduzione a Visual Studio 2005

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Funzioni, Stack e Visibilità delle Variabili in C

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Programmazione I - Laboratorio

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

Programmazione I - Laboratorio

Client - Interfaccia - Implementazione

Programmazione I - Laboratorio

Classi di memorizzazione

Lab 01 Introduzione a Codelite

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2009/2010

Debug di un programma

Indovina la lettera...

4 - Tipi di dato primitivi

Funzionalità. Il preprocessore C. Inclusione di file. Inclusione di file

C: panoramica. Violetta Lonati

Linguaggio C Debugging

Breve Riepilogo del Linguaggio C

Linguaggio C: introduzione

Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

IDE DevC

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

PER UTILIZZARE LCC IN LAB

Introduzione al linguaggio C Puntatori

TUTORATO di LINGUAGGI I

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

Lezione 10: Librerie e compilazione separata

Kernel and User space

Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica

Informazioni sull esame e Regole per lo svolgimento dei progetti

AMBIENTI DI PROGRAMMAZIONE

Linguaggio C. Appunti per il corso di Laboratorio di Algoritmi e Strutture Dati. Stefano Aguzzoli

Linguaggi di alto livello, compilatori e interpreti

Definizione di metodi in Java

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

1 PANORAMICA SUL LINGUAGGIO C

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Elementi di informatica

Introduzione al C. Introduzione. Linguaggio ad alto livello. Struttura di un programma C

Introduzione al DEV C++

Introduzione alla Programmazione in C

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Linguaggi di Programmazione

I.I.S. Federico II di Svevia - Melfi

Il compilatore Dev-C++

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

DIRETTIVE DI PREPROCESSORE

Il linguaggio C. Puntatori e dintorni

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli:

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

Le basi del linguaggio Java

COMPILAZIONE. Tarsformazione di linguaggi

Espressione di chiamata di funzione

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

Università di Ferrara. Facoltà di Ingegneria. Esercitazioni di

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

COSTRUZIONE DI UN APPLICAZIONE

Elementi di programmazione

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Informatica! Appunti dal laboratorio 1!

Introduzione alla programmazione in C

INTRODUZIONE ALLA PROGRAMMAZIONE

Linguaggi di programmazione

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice

La gestione della memoria dinamica Heap

La programmazione in linguaggio C

Modularizzazione del software

Introduzione alla programmazione strutturata

Esercizio 1 (15 punti)

Laboratorio di Calcolo Linguaggi di programmazione

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Tutorial su Codelite. Luca Ceriani 2011 Federico Cerutti

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Transcript:

Programmazione I - Laboratorio Introduzione alle lezioni in laboratorio Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea in Informatica A.A. 2012/2013 G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 1 / 15

Compilare un programma C La compilazione di un programma C si articola in tre fasi principali: 1 pre-processing 2 compilazione (vera e propria) 3 collegamento (linking) a librerie e moduli Vediamo come funzionano queste fasi usando il compilatore gcc G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 2 / 15

Fase I: pre-processing E la fase in cui vengono gestite le direttive al compilatore: Espansione degli #include: il compilatore carica le dichiarazioni delle funzioni definite nelle librerie incluse al fine di controllare che tali funzioni siano usate correttamente nel programma Sostituzione delle costanti definite con #define: il compilatore cerca tutte le occorrenze di tali costanti nel programma e le sostituisce con i valori corrispondenti Gestione di altre direttive che non vedremo... G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 3 / 15

Esempio - esempio comp.c /* piccolo esempio per spiegare il preprocessing */ # include <stdio.h> # define K 10 int main () { int i=k; for ( i =0; i<k; i ++) printf ("%d",i); } Eseguendo: gcc -E esempio_comp.c si ha come risultato l ouput del preprocessore. G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 4 / 15

Fase II: compilazione (1) E la fase in cui il programma viene trasformato in codice binario (non ancora in un eseguibile). E composto di diverse sotto-fasi (non necessariamente sequenziali): 1 Controllo dei tipi controllo che le variabili utilizzate siano state dichiarate controllo che le operazioni nelle espressioni siano usate con argomenti di tipo appropriato controllo che negli assegnamenti il tipo della variabile da assegnare e dell espressione assegnata sia lo stesso (o compatibile) controllo che le funzioni siano chiamate con parametri di numero e tipo opportuno... 2 Analisi e ottimizzazioni Eliminazione del codice morto (non raggiungibile durante l esecuzione) Tail recursion... 3 Generazione del codice binario G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 5 / 15

Fase II: compilazione (2) Eseguendo: gcc -c esempio_comp.c si ha come risultato l ouput del preprocessore (detto modulo oggetto o object file ) che tipicamente ha estensione.o. G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 6 / 15

Fase III: collegamento (linking) a librerie e moduli Si collegano insieme più moduli oggetto per creare un file eseguibile file1.o file2.o...: diversi moduli oggetto dello stesso programma ottenuti tramite compilazione separata (vedremo tra poco) librerie standard e di sistema libfile1.a libfile2.a...: diverse librerie esterne che forniscono funzioni utilizzate all interno del programma Il risultato di questa fase è un unico file eseguibile (ad es. a.out) Eseguendo gcc esempio_comp.o Il modulo oggetto verrà trasformato in un file eseguibile G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 7 / 15

Moduli e compilazione separata (1) Un programma C non deve necessariamente consistere di un unico file. Programmi complessi sono solitamente divisi in moduli separati, ogniuno implementato in un proprio file. Ogni modulo consisterà di un insieme di funzioni, variabili globali, costanti, ecc... che devono complessivamente non contenere duplicati. In particolare, dovremo avere un modulo principale che contiene la funzione main G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 8 / 15

Moduli e compilazione separata (2) Scopi di suddividere il codice sorgente C in più moduli organizzare meglio il codice dividersi il lavoro compilare separatamente le varie parti (e non ricompilare tutte le volte l intero programma) G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 9 / 15

Moduli e compilazione separata (3) Per incorporare un file esterno usare #include con le virgolette! /* main.c ( modulo principale )*/ # include " modulo.c" int main () { return fibonacci (7); } /* modulo.c */ int fibonacci ( int n) { if (n <0) return -1; if ( n ==0 n ==1) return n; else return fibonacci (n -1)+ fibonacci (n -2); } Attenzione, questo è però un modo SBAGLIATO di usare la compilazione separata: i file sono separati, ma vengono ricomposti prima della compilazione Per convincersene basta provare a eseguire: gcc -E main.c G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 10 / 15

Moduli e compilazione separata (4) Cosa è necessario fare: Separare le dichiarazioni delle funzioni dalle definizioni creando dei file di headers con estensione.h /* main.c ( modulo principale )*/ # include " modulo.h" /* nota.h */ int main () { return fibonacci (7); } /* modulo.h */ int fibonacci ( int n); /* modulo.c */ int fibonacci ( int n) { if (n <0) return -1; if ( n ==0 n ==1) return n; else return fibonacci (n -1)+ fibonacci (n -2); } G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 11 / 15

Moduli e compilazione separata (5) Il file di header contenente la dichiarazione della funzione fibonacci è sufficiente per compilare il codice del main main.c e fibonacci.c possono veramente essere compilati separatamente Sequenza dei comandi: 1. gcc -c main.c 2. gcc -c modulo.c 3. gcc main.o modulo.o Dopo la compilazione: Se modifico main.c devo ripetere i passi 1 e 3 (non 2) Se modifico modulo.c devo ripetere i passi 2 e 3 (non 1) Se modicifo modulo.h (e quindi anche modulo.c) devo ripetere tutti i passi G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 12 / 15

Moduli e compilazione separata (6) Quando si inseriscono nei file.h dichiarazioni di tipo come, ad esempio, un costrutto struct, si può verificare il problema della doppia inclusione /* modulo1.h */ struct prova { int primo ; int secondo ; }; /* modulo2.h */ # include " modulo1.h" int stupida ( struct prova p); /* main.c */ # include " modulo1.h" # include " modulo2.h" int main () { struct prova p; p. primo = 1; p. secondo = 2; return stupida ( p); } In fase di compilazione di main.c avermo un errore (struct prova definita due volte) G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 13 / 15

Moduli e compilazione separata (6) Il problema della doppia inclusione si risolve tramite alcune direttive per il preprocessore che consentono di realizzare una compilazione condizionale /* modulo1.h */ # ifndef MODULO1_H # define MODULO1_H struct prova { int primo ; int secondo ; }; # endif /* modulo2.h */ # ifndef MODULO2_H # define MODULO2_H # include " modulo1.h" int stupida ( struct prova p); # endif /* main.c */ # include " modulo1.h" # include " modulo2.h" int main () { struct prova p; p. primo = 1; p. secondo = 2; return stupida ( p); } La prima volta che si include un file #ifndef (if not defined) lascia proseguire. L uso di #define però fa si che un successivo tentativo di esecuzione di #ifndef fallisca, non consentendo l inclusione del file.

Parametri del compilatore Alcuni parametri IMPORTANTI del compilatore gcc sono i seguenti: -o : Consente di specificare il nome del file eseguibile da generare (in alternativa a a.out. Utilizzo: gcc -o prova prova.c (l eseguibile sarà il file prova) -Wall : Abilita la visualizzazione di tutti i messaggi di warning generati durante la compilazione -pedantic : controlla che il programma soddisfi esattamente le regole del C standard (ISO C). Segnala eventuali violazioni dello standard con messaggi di warning E sempre bene usare gcc come segue: gcc - pedantic - Wall -o prova prova. c G. Mezzetti & P. Milazzo (Univ. di Pisa) Intro LAB A.A. 2012/2013 15 / 15