Argomenti Direttive di Preprocessore: Compilazione Condizionale

Slides:



Advertisements
Presentazioni simili
File Linguaggio C.
Advertisements

Introduzione al linguaggio C++
LINGUAGGIO DI PROGRAMMAZIONE C
INFORMATICA Strutture condizionali
Uso avanzato di C.
Introduzione al linguaggio C
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Selezione - approfondimento
Marco Barisione Estendere Python in C.
Istruzioni condizionali e blocco
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Type Checking (1° parte)
Algoritmi e Programmazione
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Introduzione al linguaggio C
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.
Programmazione Procedurale in Linguaggio C++
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
FUNZIONI DI BIBLIOTECA
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Process synchronization
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione II Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione II Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Programmazione Un programma descrive al computer, in estremo dettaglio, la sequenza di passi necessari a svolgere un particolare compito L’attività di.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
9) If e else. Lab.Calc.I AA2002/03 - cap.92 espressione.
Istruzioni di selezione (If/else/switch)
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Dichiarazioni e tipi predefiniti nel linguaggio C
I File.
Le funzioni.
Espressioni condizionali
2000 Prentice Hall, Inc. All rights reserved. Capitolo 3 (Deitel) Lo sviluppo di programmi strutturati Indice degli argomenti Introduzione 3.2 -
Equazione di secondo grado.
Programmazione di Calcolatori
CODIFICA Da flow-chart a C++.
In molti casi è utile assegnare a degli identificatori dei valori che restino costanti durante tutto il programma e che non possano essere cambiati nemmeno.
Massimo Comun Divisore
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
Unità Didattica 1 Linguaggio C
Anno accademico Le istruzioni di controllo in C.
Programmazione in linguaggio C
Introduzione a Javascript
Vettori (a una dimensione)
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
Il linguaggio C Puntatori e dintorni.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
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 
Laboratorio di Linguaggi... altre D O M A N D E ! Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (III)
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

Argomenti Direttive di Preprocessore: Compilazione Condizionale Uso avanzato di Make

Compilazione Condizionale Esietono direttive del preprocessore che consentono la compilazione condizionata, vale a dire la complazione di parte del codice sorgente solo sotto certe condizioni. L’uso e’ molteplice: Gestione degli errori Portabilità del codice Inclusione di codice scritto da altri Debug del codice sorgente

Comandi per la Compilazione Condizionale #if include nella compilazione un qualche testo in dipendenza del valore di un’espressione costante #ifdef include un qualche testo nella compilazione se un nome di macro é definito #ifndef include un qualche testo nella compilazione se un nome di macro non é definito #else include un qualche testo, se i precedenti test in #if , #ifdef , #ifndef o #elif sono falliti #elif permette la scrittura di if - else annidati, l’ultimo deve essere #else #endif conclude l’espressione condizionale

Comandi per la Compilazione Condizionale SEMANTICA SINTASSI #if espressione costante gruppo di linee di codice 1 #else gruppo di linee di codice 2 Se espressione costante ≠ 0 verrà compilato il gruppo di linee di codice 1 e l’altro viene scaricato altrimenti verrà compilato il il gruppo di linee di codice 2 e l’altro scaricato

Comandi per la Compilazione Condizionale espressione costante: viene valutata a tempo di compilazione espressione costante: di tipo intero, coinvolgendo solo costanti intere, costanti di tipo char. Tutta l’aritmetica è fatta usando il tipo long o unsigned long. Non ammette l’uso dell’operatore sizeof o un cast Un gruppo di linee di codice può contenere un qualsiasi numero di linee di testo, anche altre direttive di preprocessore o anche nessuna linea

Comandi per la Compilazione Condizionale SINTASSI SEMANTICA Se espr cost1 ≠ 0 compilail linee di codice 1 e tutto il resto viene scaricato altrimenti verrà valutata l’ espr.cost2 del successivo #elif e se diversa da 0 vengono compilate le linee di codice 2 e il resto scaricato e così via. Se nessuna delle espr. cost.i dà un valore diverso da 0, allora verrà compilato il gruppo inee di codice e verrà ignorato il resto #if espr. cost.1 linee di codice 1 #elif espr. Cost.2 linee di codice 2 ... #elif espr.cost.n linee di codice n #else linee di codice

Comandi per la Compilazione Condizionale SINTASSI SEMANTICA #ifdef identific. Linee di codice 1 #ifndef identific. Linee di codice Compila le linee di codice 1 solo nel caso in cui identific è stato prcedentemente definito medinate una direttiva #define senza che sia staia eliminato da una direttiva #undef Compila il codice linee di codice solo nel caso in cui l’identific non e’ stato definito

Uso ed Esempi Usare printf per il debug #define DEBUG 1 #if DEBUG printf(“debug: a = %d\n”,a); #endif Visto che DEBUG è diverso da 0 le linea del printf viene compilata ed aiuta nel debug del programma. Successivamente ommettendo #define DEBUG 1 le linee non verrano compilate e quindi eseguite.

Uso ed Esempi Costruzione alternativa #define DEBUG #ifdef DEBUG printf(“debug: a = %d\n”,a); #endif Visto che DEBUG è defintiole linea del printf viene compilata ed aiuta nel debug del programma. Successivamente ommettendo #define DEBUG le linee non verrano compilate e quindi eseguite.

Uso ed Esempi Prevenire sovrapposizioni di MACRO: #undef #include “progetto_esterno.h” #undef MACRO #define MACRO Non conoscendo totalmente progetto_esterno.h, prima di definere una propria macro, conveine usare undef per prevenire una doppia definizione

Uso ed Esempi Test durante lo sviluppo di un programma Blocco istruzioni 1 Blocco istruzioni 2 Blocco istruzioni 3 /* */ Durante un test potrebbe essere desiderabile eliminare temporaneamente alcune parti di codice. Alternativa Blocco istruzioni 1 #if 0 Blocco istruzioni 2 #endif Blocco istruzioni 3 Problemi: Il codice eliminato contine a sua volta dei commenti

Comando defined Nello standard ANSI C è disponibile l’operatore defined. L’espesione defined identifcatore è equivalente a defined(identificatore) e vale 1 se l’dentificatore è stato definito. Nota. Può essere usata in una espressione di #if. #define HP9000 #if defined(HP9000) ... #endif

Un esempio Scriviamo un un programma che ordina un vettore. Lo testiamo usando le direttive del proeprocessore #include <stdio.h> #include <stdlib.h> #define SIZE 6000 #define DEBUG void insSort(int * a, int n); /* ordina in ordine crescente un vettore di interi * Precondizione : (a != NULL && n > 0) * Postcondizione : a[i] <= a[i+1], per 0<=i<n.*/ void stVett(int *, int); /* visualizza sul monitor gli elementi del vettore */

Un esempio main() { int app, num, i, vett[SIZE]; printf("Inserisci il numero di elementi del vettore (<= %d).\n",SIZE); scanf("%d",&num); srand(app); #if defined(DEBUG) printf("Inizializziamo un vettore\n"); #endif for (i = 0;i < num;i++) vett[i] = rand() ; #ifdef DEBUG printf("\nGli elementi scelti a caso e inseriti nel vettore sono:\n"); stVett(vett,num); insSort(vett,num); printf("\nGli elementi ordinati nel vettore sono:\n"); #else printf("Abbiamo finito il debugging di insSort\n"); return 0;}

Fase di Debugging: DEBUG attivo Un esempio: Output Fase di Debugging: DEBUG attivo Inserisci il numero di elementi del vettore (<= 6000). 15 Inizializziamo un vettore Gli elementi scelti a caso e inseriti nel vettore sono: 16838 5758 10113 17515 31051 5627 23010 7419 16212 4086 2749 12767 9084 12060 32225 Gli elementi ordinati nel vettore sono: 2749 4086 5627 5758 7419 9084 10113 12060 12767 16212 16838 17515 23010 31051 32225

Fine Fase di Debugging: #undef DEBUG Un esempio: Output Fine Fase di Debugging: #undef DEBUG #include <stdio.h> #include <stdlib.h> #define SIZE 6000 #define DEBUG #undef DEBUG void insSort(int * a, int n); /* ordina in ordine crescente un vettore di interi * Precondizione : (a != NULL && n > 0) * Postcondizione : a[i] <= a[i+1], per 0<=i<n.*/ void stVett(int *, int); /* visualizza sul monitor gli elementi del vettore */

Un esempio: Output Inserisci il numero di elementi del vettore (<= 6000). 10 Abbiamo finito il debugging di insSort

Evitare possibili errori di sintassi Quando si usa la compilazione condizionata il codice escluso non solo non genera codice oggetto ma non è nemmeno verificato sintatticamente, questo può nascondere degli errori che solo in un secondo momento sarebbero individuati. Alternativa alla compilazione separata Usando normali istruzioni condizionali si ottiene il risultato che queste verranno verificate anche se per esse molti compilatori non genereranno codice. rimpiazzato da #define DEBUG #ifdef DEBUG ... #endif #if defined(DEBUG) #undef DEBUG enum { DEBUG = 1} if (DEBUG) {...} enum { DEBUG = 0}

Compilazione di più files Introduzione all´uso di make Un programma può esere formato da piu file .h e .c contenuti in una directory di lavoro Il comando make legge per default il file makefile che ci permette di specificare e descrivere le dipendenze tra i vari moduli e file di cui è composto il programma. In particolare contiene le istruzioni per compilare e ricompilare il programma

Compilazione di più files Esempio: main.c e sum.c includono entrambi l’header sum.h si vuole che il programma eseguibile sia scritto sul file sum Contenuto di Makefile sum: main.o sum.o cc –o sum main.o sum.o main.o: main.c sum.h cc –c main.c sum.c sum.c sum.h cc-c sum.c Inizia con una tabulazione dipendenze Riga di comando

Sintassi di un makefile Un makefile è costituito da una sequenza di REGOLE che Specificano DIPENDENZE ed AZIONI. Una regola iniza con Una sequenza di nomi di file, detti file target, seprati da spazie e seguiti da un “:”, a loro volta seguiti da una sequenza di file che rappresentano i PREREQUISITI e detti file sorgente sum: main.o sum.o Tutte le righe succesive che inziano con una tabuilazione rappresentazno azioni sum: main.o sum cc –o sum main.o sum.o

Albero dipendenze e regole predefinite sum main.o sum.o main.c sum.h sum.c sum: main.o sum.o cc –o sum main.o sum.o main.o: main.c sum.h cc –c main.c sum.o: sum.c sum.h cc-c sum.c Regola predefinita: file .o dal corrispondente file .c sum: main.o sum.o cc –o sum main.o sum.o main.o: sum.h cc –c main.c sum.o: sum.h cc-c sum.c Versione semplificata

Regole predefinite e semplificazioni sum: main.o sum.o cc –o sum main.o sum.o main.o: sum.h cc –c main.c sum.o: sum.h cc-c sum.c Nell’esempio precedente main.o e sum.o dipendono entrambi da sum.h. Possiamo semplificare il precedente makefile nella forma: $*.c viene espanso in main.c nel caso in cui debba essere creato main.o e in sum.c nel caso debba essere creato sum.o sum: main.o sum.o cc –o sum main.o sum.o main.o sum.o: sum.h cc –c $*.c

Makefile: altre funzionalità Permette l’introduzione di commenti # Questo è un commento Permette la definizione di MACRO DIRLAVOR = /home/Nicola/ Permette richiamare una macro $(DIRLAVORO) Permette di evitare di scrivere righe di comando sullo schermo @echo “linking...” @cc –c

Un esempio #Esempio di file Makefile per ordinamento BASE = /home/blufox/base CC = gcc CFLAGS = -0 - Wall EFILE = $(BASE)/bin/compare_sorts INCLS = -I $(LOC)/include LIBS = $(LOC)/lib/g_lib.a \ $(LOC)/lib/u_lib.a LOC = /usr/local OBJS = main.o another_qsort.o chk_order.o\ compare.o quicksort.o $(EFILE): $(OBJS) @echo “linking ...” @$(CC) $(CFLAGS) –o $(EFILE) $(OBJS) $(LIBS) $(OBJS): compare_sorts.h $(CC) $(CFLAGS) $(INCLS) –c $*.c