Il pre-processore C modifica il testo del programma prima che esso raggiunga il compilatore vero e proprio. ANCORA SUL PRE-PROCESSORE C File sorgente.c.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
Una applicazione complessa non può essere sviluppata in un unico file: sarebbe ingestibile! Deve necessariamente essere strutturata su più file sorgente.
Introduzione al linguaggio C
Procedure e funzioni A. Ferrari.
PHP.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
Semantica operazionale
Introduzione al linguaggio C
Basi di Dati prof. A. Longheu 4 – Progettazione – Introduzione e Modello E-R Cap. 5 Basi di dati Atzeni – Ceri – Paraboschi - Torlone.
Anno accademico Il preprocessore del linguaggio C.
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
TERNE PITAGORICHE Obiettivi dell’esercitazione
INFORMATICA typedef.
FUNZIONI DI BIBLIOTECA
Funzioni definite dall’utente
Sistemi basati su conoscenza Conoscenza e ragionamento Prof. M.T. PAZIENZA a.a
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Process synchronization
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 15 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 18 Aprile 2012.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Semantica di Tarski.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Dichiarazioni e tipi predefiniti nel linguaggio C
Le funzioni.
Espressioni condizionali
Modello E-R Generalizzazioni
Modello E-R Generalizzazioni
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
LAPPROCCIO FUNZIONALE Obiettivo: esprimere la soluzione di un problema sotto forma di funzione. Quali funzioni primitive? Quali meccanismi di combinazione?
IL CONCETTO DI PACKAGE Una applicazione è spesso composta di molte classi (eventualmente correlate) Un package è un gruppo di classi che costi- tuiscono.
LINGUAGGI DI PROGRAMMAZIONE
AN FI Un denominatoe comune Linguaggi di programmazione Un denominatore comune.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Per costruire unapplicazione occorre compilare il file (o i file se più duno) che contengono il testo del programma (file sorgente) Il risultato sono uno.
CODIFICA Da flow-chart a C++.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Lezione 7 Strutture di controllo Il ciclo while
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Unità Didattica 1 Linguaggio C
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Lezione 3 Struttura lessicale del linguaggio
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Introduzione a Javascript
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Scrivere e compilare programmi
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
1 Il preprocessore. 2 Viene invocato dal gcc prima della compilazione vera e propria ( cpp ) Esegue delle manipolazioni testuali sul file –sostituisce.
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
Linguaggio come processo cognitivo
Copyright © Istituto Italiano Edizioni Atlas
Problemi, algoritmi e programmazione
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Metodi in Java. Note Identificazione input: (il raggio è un numero reale !!!) Identificazione delle operazioni necessarie al calcolo Area=r*r*PI Circonferenza=2*r*PI.
Transcript della presentazione:

Il pre-processore C modifica il testo del programma prima che esso raggiunga il compilatore vero e proprio. ANCORA SUL PRE-PROCESSORE C File sorgente.c File modificato preproc. al compi- latore C

Cosa può fare?  includere altre porzioni di testo, prese da altri file  effettuare ricerche e sostituzioni (più o meno sofisticate) sul testo  inserire o sopprimere parti del testo a seconda del verificarsi di certe condizioni da noi specificate. IL PRE-PROCESSORE C

Sintassi: #define testo1testo2 Effetto: definisce una regola di ricerca e sostitu- zione: ogni occorrenza di testo1 verrà sostituita da testo2 Scopo: definire costanti simboliche (per conven- zione, testo1 è maiuscolo) LA DIRETTIVA #define

ESEMPIO #define RADICEDI F main() { float lato = 18; float diagonale = lato * RADICEDI2; } Prima del pre-processing: main() { float lato = 18; float diagonale = lato * F ; } Dopo il pre-processing:

ESEMPIO #define RADICEDI F main() { float lato = 18; float diagonale = lato * RADICEDI2; } Prima del pre-processing: main() { float lato = 18; float diagonale = lato * F ; } Dopo il pre-processing: Regola di ricerca e sostituzione: ogni occorrenza di RADICEDI2 deve essere rimpiazzata da F Programma risultante inviato al compilatore

Attenzione:  nell’effettuare ricerche e sostituzioni, il pre-processore non sa quello che fa  si limita a sostituire testo con altro testo  non effettua controlli di nessun tipo, né può farli: non è un compilatore, e dunque non conosce la sintassi del C!  Quindi, regole sbagliate possono produrre risultati assurdi! IL PRE-PROCESSORE C

CONTRO-ESEMPIO #define RADICEDI paperino main() { float lato = 18; float diag = lato * RADICEDI2; } Prima del pre-processing: main() { float lato = 18; float diag = lato * 1.414paperino ; } Dopo il pre-processing:

CONTRO-ESEMPIO #define RADICEDI paperino main() { float lato = 18; float diag = lato * RADICEDI2; } Prima del pre-processing: main() { float lato = 18; float diag = lato * 1.414paperino ; } Dopo il pre-processing: La regola di ricerca e sostituzione è perfettamente lecita in sé…... ma il programma risultante è sintatticamente errato!!

La regola di ricerca e sostituzione introdotta dalla direttiva #define si chiama macro. Regole semplici, come le precedenti: #define MAX 10 #define RADICEDIDUE F definiscono macro semplici. La direttiva #define permette però anche di definire regole più complesse, che vanno sotto il nome di macro parametriche. LE MACRO

La regola di ricerca e sostituzione può comprendere dei parametri: #define DOUBLE(X) 2*X il parametro che segue il nome DOUBLE si usa per determinare il testo da inserire in sostituzione di DOUBLE(X).  così, la frase DOUBLE(3) sarà sostituita dalla frase 2*3  analogamente, la frase DOUBLE("a") sarà sostituita dalla frase 2*"a" MACRO PARAMETRICHE

Attenzione: il meccanismo di sostituzione del testo può portare, a volte, a risultati inattesi e per certi versi sorprendenti. Ad esempio, la macro: #define DOUBLE(X) 2*X usata nel seguente modo: b = DOUBLE(a+1) produce come testo risultante: b = 2*a+1 MACRO PARAMETRICHE Nelle intenzioni voleva significare “il doppio di a+1”... … ma l’espressione risultante ha un altro significato!

Siamo in presenza di una diversa lettura della macro  l’utente intendeva il parametro come un “tutt’uno”  ma la regola di sostituzione non ha rispettato questa “visione”, in quanto l’operatore * ha priorità superiore al + È una macro sbagliata. MACRO PARAMETRICHE

Soluzione: inserire una coppia di parentesi per assicurare che ciò che è “concettual- mente un tutt’uno” rimanga anche pratica- mente un tutt’uno. #define DOUBLE(X) 2* ( X )  così, la frase DOUBLE(a+1) sarà sostituita dalla frase 2*(a+1) che esprime correttamente quanto desiderato. MACRO PARAMETRICHE

Consideriamo quest’altra macro: #define ADD(X,Y) (X) + (Y)  I singoli parametri sono fra parentesi, in modo da evitare il problema precedente  Tuttavia, un altro problema è in agguato. Se la macro viene usata come: b = 2 * ADD(3, 4) il testo risultante è b = 2*(3)+(4) che non è affatto “il doppio di 3+4” !! MACRO PARAMETRICHE

È un’altra forma di diversa lettura della macro:  l’utente intendeva la macro come un “tutt’uno”  ma la regola di sostituzione non ha rispettato questa “visione”, in quanto l’ha espansa come espressione (X)+(Y), e la priorità degli operatori ha creato il guaio. Occorre riscrivere la macro. MACRO PARAMETRICHE

Soluzione: inserire una coppia di parentesi intorno alla macro nel suo complesso per assicurare non già l’atomicità dei singoli parametri, quanto l’atomicità della macro nel suo complesso. #define ADD(X,Y) ( (x)+(Y) )  così, la frase 2*ADD (3,4) sarà sostituita dalla frase 2*((3)+(4)) che esprime correttamente quanto desiderato. MACRO PARAMETRICHE

Una macro non dovrebbe mai avere effetti collaterali, perché le espansioni multiple potrebbero giocare brutti scherzi. Esempio: #define MAX(X,Y) ( ((x) > (Y)) ? (X) : (Y) )  nessun problema con frasi come MAX (3,8) o MAX(z,x+1) … .. ma molti problemi con MAX (++x,4) !! MACRO CON EFFETTI COLLATERALI

Una macro non dovrebbe mai avere effetti collaterali, perché le espansioni multiple potrebbero giocare brutti scherzi. Esempio: #define MAX(X,Y) ( ((x) > (Y)) ? (X) : (Y) )  nessun problema con frasi come MAX (3,8) o MAX(z,x+1) … .. ma molti problemi con MAX (++x,4) !! MACRO CON EFFETTI COLLATERALI Se x vale 5, nelle inten- zioni doveva calcolare max(6,4), cioè 6... … ma in realtà X viene espanso due volte e quindi x è incrementato due volte! Morale: max(6,4) dà 7

MACRO vs. FUNZIONI  una funzione è un'entità computazionale invocata a run-time, il cui mondo (il record di attivazione) viene generato a tempo d'esecuzione a fronte di ogni chiamata  il compilatore può effettuare controlli di correttezza!  una macro invece è solo una regola di espansione di testo, applicata dal pre-processore prima ancora che il programma venga compilato.  nessun controllo è possibile