Il processo di compilazione

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Il processo di compilazione"

Transcript

1 Il processo di compilazione Il processo che porta dal codice scritto in linguaggio C alla creazione del corrispondente file eseguibile può essere schematizzato in questo modo: 0. Scrittura del codice C 1. Analisi del codice da parte del Preprocessore e creazione del file che verrà analizzato dal compilatore 2. Il compilatore trasforma le istruzioni scritte in linguaggio C (codice ad alto livello) in istruzioni in linguaggio assembly (codice a basso livello) le quali poi, grazie all'assembler, vengono tradotte in linguaggio macchina. Il codice così prodotto è già nella forma tale da poter essere eseguito dal calcolatore ed esso viene indicato con il termine di codice oggetto. Tale codice, però, non rappresenta ancora il programma eseguibile. 3. L'ultimo passaggio, che permette di passare dal codice oggetto al codice eseguibile, richiede che vengano risolti eventuali riferimenti a funzioni esterne al codice (ad esempio, funzioni di libreria). Questo compito è affidato al linker che unisce al codice oggetto porzioni di codice oggetto presenti nelle librerie. Completato questo passaggio, si ottiene il file eseguibile. Fino ad ora tutti questi passaggi non sono stati "visibili", in quanto il programma gcc richiama autonomamente il preprocessore, il compilatore, l'assemblatore ed il linker senza che sia richiesto l'intervento dell'utente. Vediamo nel dettaglio come si svolgono e cosa producono i passaggi visti sopra. 0. Scrittura del codice. Supponiamo di aver preparato questo semplice programma e di averlo salvato nel file prog.c : /* inizio codice questo commento verrà rimosso da parte del preprocessore */ #include <stdio.h> #define VALORE 30 {int a = VALORE; printf("\n il valore della variabile e\' : %d",a); /* fine codice */

2 1. Passiamo ora alla fase successiva Preprocessore: il preprocessore rimuove eventuali commenti presenti nel testo ed interpreta le direttive ad esso rivolte. Dopo l'azione del preprocessore il file si presenta così:... qui c'è tutto il codice C contenuto in stdio.h... {int a = 30; printf("\n il valore della variabile e\' : %d",a); Per visualizzare questo risultato è sufficiente dare questo comando gcc -E programma.c -o prog_preprocessore.c Il significato dell'opzione -E è il seguente: il file va interpretato SOLO dal preprocessore. Una volta interpretato il file, il risultato dell'interpretazione, ovvero l'output prodotto dal preprocessore, va inserito nel file prog_preprocessore.c 2. Preparazione del codice oggetto. Per produrre il codice oggetto, il compilatore (e poi l'assemblatore) deve poter interpretare il contenuto del file prodotto dal preprocessore, ovvero il contenuto di prog_preprocessore.c Per ottenere questo risultato dobbiamo usare questo comando: gcc -c prog_preprocessore.c -o prog_oggetto.o Il suo significato è il seguente: gcc deve effettuare il solo passo di compilazione (a questo serve l'opzione -c) e, per compiere questo passo deve analizzare il contenuto del file prog_preprocessore.c, file che deve essere interpretato come output del preprocessore. Il risultato della sola compilazione, cioè l'output prodotto da questo comando, ovvero il codice oggetto, deve essere inserito nel file prog_oggetto.o Nota:

3 Per visualizzare anche la versione del codice in linguaggio assembly, è sufficiente bloccare il processo di compilazione al passo che precede quello in cui viene prodotto l'oggetto. gcc -S prog_preprocessore.c -o prog_assembler.s per creare poi l'oggetto si usa il comando gcc -c prog_assembler.s -o prog_oggetto.o Fino a questo punto, tutti i passaggi sono stati prodotti a partire dal codice iniziale (e dal contenuto dei file di intestazione in esso eventualmente inclusi). Il codice oggetto, quindi, contiene la versione in linguaggio macchina delle istruzioni contenute nel file prog.c; tale codice, però, non contiene informazioni relative al funzionamento di printf(), non essendo stata tale funzione implementata nè nel codice nè all'interno del file di intestazione stdio.h. Tali informazioni devono essere prese dai file di libreria, e questo è il compito del linker. 3. Preparazione del codice eseguibile. Per far entrare in azione il linker, è sufficiente far interpretare al programma gcc il codice oggetto prodotto al punto precedente. Questo risultato si ottiene scrivendo gcc prog_oggetto.o -o prog_eseguibile Il significato di tale comando è: analizza il file prog_oggetto.o (dalla sua estensione gcc capisce che si tratta di codice oggetto), se al suo interno ci sono richiami a funzioni esterne al codice vai nella libreria in cui è contenuto il codice oggetto di tali funzioni, allega al codice oggetto prodotto al punto precedente il codice oggetto relativo alle funzioni e produci il file eseguibile. L'output di tale processo va inserito in prog_eseguibile, che rappresenta finalmente il file che può essere mandato in esecuzione dal sistema operativo. Fino a questo momento la nostra attenzione è stata rivolta al punto 0, ovvero della scrittura del codice C, in quanto le librerie (ovvero gli archivi contenenti il codice oggetto relativo alle funzioni non implementate dall'utente che venivano di volta in volta inserite nel codice) erano già disponibili sul pc.

4 Proviamo ora a costruire una libreria! Ricetta: scrivere le funzioni di interesse e inserire in un archivio il corrispondente codice oggetto. Alla libreria dovrà essere poi allegato un file di intestazione. Facciamo un esempio semplice; il metodo potrà essere poi applicato alle funzioni contenute nel file mie_funzioni.h La struttura del file mie_funzioni.h è la seguente: #include <stdio.h> #include <string.h> int miafuzione(char*); eventuali direttive dichiarazioni int miafunzione(char* stringa) {int tmp=strlen(stringa); printf("\n la stringa è composta da %d caratteri",tmp); return tmp; } implementazioni Cosa serve per la preparazione del file di intestazione: i PROTOTIPI Cosa serve per la preparazione della libreria: le implementazioni Creiamo due file a partire da mie_funzioni.h File con le implementazioni e le eventuali direttive per il preprocessore user_functions.c #include <stdio.h> #include <string.h> int miafunzione(char* stringa) {int tmp=strlen(stringa); printf("\n la stringa è composta da %d File con le intestazioni user_functions.h /* visto che qui non compare l'implementazione, è buona norma scrivere un commento per descrivere il compito svolto dalla funzione */

5 caratteri",tmp); return tmp; } int miafuzione(char*); A questo punto è possibile produrre il codice oggetto a partire dal file user_functions.c gcc -c user_functions.c -o user_functions.o Tale codice oggetto va ora inserito in un archivio. Per compiere quest'operazione si utilizza il programma dedicato alla creazione degli archivi: ar ar -r libuser.a user_functions.o Ora la libreria è stata creata. (Nello scegliere il nome, il prefisso lib e l'estensione.a sono obbligatori) Cosa ce ne facciamo??? Prepariamo un codice C, prova.c, che richiami la funzione miafunzione() /* inizio codice */ #include <user_functions.h> {miafunzione("ciao ciao"); /* fine codice */ A questo punto, non posso compilare normalmente prova.c, in quanto l'implementazione della funzione non è presente nè in prova.c nè in user_functions.h. Devo quindi specificare che il codice oggetto relativo alla funzione si trova nella libreria libuser.a. Questo si indica così: gcc nome_file_da_compilare -Lnome_directory_libreria -lnome_lib -o nome_file_eseguibile dove

6 nome_file_da_compilare rappresenta il nome del file contenente le istruzioni in C nome_directory_libreria è il nome della directory in cui si trova il file di libreria nome_lib è il nome del file di libreria Questo comando nel nostro caso diventa: gcc prova.c -L./ -luser -o prova_eseguibile La cosa ricorda un po' la modalità di compilazione utilizzata quando nel codice erano presenti funzioni appartenenti alla libreria matematica; in quel caso non era stata usata l'opzione -L in quanto la libreria matematica si trova in una delle directory in cui il compilatore cerca automaticamente i file di libreria. Se preferite arrivare al medesimo risultato, ovvero riuscire a produrre l'eseguibile a partire dal file prova.c, e volete evitare la creazione di una libreria, è sufficiente dire al linker di unire il codice oggetto prodotto a partire da user_functions.c con quello prodotto a partire da prova.c gcc -c prova.c -o prova.o (con questa istruzione produco il codice oggetto di prova.c) gcc -c user_functions.c -o user_functions.o gcc prova.o user_functions.o -o prova_eseguibile Oltre a permetterci di creare un "pacchetto" che permette di raggruppare tutti i codici oggetto relativi alle varie funzioni implementate (oltre che a farci risparmiare il tempo richiesto per la compilazione dei file che servono per la creazione delle librerie, tempo che per programmi complessi può anche essere molto lungo), quali vantaggi possiamo

7 trarre dalla compilazione effettuata suddividendo il codice in più file? Torniamo al codice scritto ieri. Nel file, la gestione dell'area di memoria contenente la stringa inserita dall'utente veniva effettuata solo mediante delle chiamate ad opportune funzioni di gestione. Il programmatore, dall'interno di main(), era però comunque in grado di accedere all'area di memoria contenente tale stringa ed, eventualmente, in grado di modificarla. /* inizio codice */ #include <stdio.h> #include <stdlib.h> #include <string.h> char * CreaArray(int); void Cifratura(char *); char* Copia(char *); void OrdinaStringa(char*); void OrdinaParola(char*); void Visualizza(char *); void Inizializza(char *); /* implementazione di main() */ {char *parola, *ordinata1,*ordinata2; int i; parola = CreaArray(0); Inizializza(parola); /* visualizziamo la stringa */ Visualizza(parola); /* prima di continuare facciamo due copie della stringa */ ordinata1 = Copia(parola);

8 ordinata2 = Copia(parola); /* ora possiamo codificare la stringa originale */ Cifratura(parola); Visualizza(parola); /* ordiniamo la stringa ordinata1 */ OrdinaChar(ordinata1); Visualizza(ordinata1); /* ordiniamo le parole contenute nella stringa ordinata2 */ OrdinaParola(ordinata2); Visualizza(ordinata2); /* le implementazioni delle funzioni implementate ieri sono state omesse per brevità */ void Visualizza(char *stringa) {printf("\n ecco la stringa: %s",stringa);} void Inizializza(char *stringa) {printf("\n inserisci delle parole: "); gets(stringa); } /* fine codice */ Nell'ipotesi in cui si volessero evitare modifiche accidentali da parte del programmatore all'area di memoria considerata o si volesse impedire l'accesso diretto, da parte del programmatore, a tale area di memoria è necessario modificare la struttura del programma. Questa situazione ci si è presentata all'atto della gestione dell'area di memoria contenente il buffer di input: al programmatore è consentito accedervi solo attraverso le funzioni che prelevano caratteri, parole o stringhe dal buffer stesso, non direttamente. Passo 1: trasformiamo la variabile che ci interessa proteggere in una variabile globale Questo, da un lato, implica un aumento del campo di visibilità della variabile, dall'altro richiede che i prototipi e le implementazioni delle funzioni che permetteranno di accedere

9 a tale variabile vengano modificati. Ovvero, è necessario costruire un set di funzioni che diventeranno le funzioni di accesso (in lettura e scrittura) a tale variabile. Supponiamo che le funzioni con accesso privilegiato siano: CreaArray(), per l'allocazione di memoria Inizializza(), per assegnare un valore alla stringa Copia(), per salvare il valore della stringa all'interno di un'altra stringa Tali funzioni non necessitano di un parametro perché si assume implicitamente che esso sia il puntatore parola, accessibile alle funzioni in quanto si tratta di una variabile con un campo di visibilità esteso a tutto il codice /* inizio codice: passo 1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> void CreaArray(int); char* Copia(void); void Inizializza(void); void Cifratura(char *); void Visualizza(char *); void OrdinaParola(char*); void OrdinaStringa(char*); char *parola; {char *ordinata1,*ordinata2; /* viene allocata memoria per la stringa */ CreaArray(0); /* la stringa viene inizializzata */ Inizializza(); ordinata1 = Copia(); ordinata2 = Copia(); OrdinaChar(ordinata1); Visualizza(ordinata1); OrdinaParola(ordinata2); Visualizza(ordinata2); /* qui di seguito vengono inserite solo le NUOVE implementazioni */

10 void CreaArray(int numero_caratteri) {char *parola = NULL; if(numero_caratteri == 0) { printf("\n di quanti caratteri vuoi sia composta la stringa? -> "); scanf("%d", & numero_caratteri); } else if(numero_caratteri < 0) {printf("\n Il valore del parametro non è corretto -> il programma termina "); exit(0);} parola = (char*) malloc((numero_caratteri+1) * sizeof(char)); if(parola == NULL) {printf("\n l'allocazione di memoria non e\' riuscita! -> il programma viene terminato "); exit(0);} } char * Copia(void) {char *nuova_stringa = (char*) malloc(sizeof(char)*(strlen(parola)+1); if(nuova_stringa==null) {printf("copia fallita - il programma termina"); exit(0);} strcpy(nuova_stringa,parola); return nuova_stringa; } void Inizializza(void) {printf("inserisci una stringa di testo"); gets(parola); } /* fine codice: passo 1 */ Importante: ora creiamo un file di intestazione ed uno con le implementazioni delle funzioni e, soprattutto, modifichiamo la classe di memorizzazione della variabile globale. La separazione del file in tre parti non porta a sostanziali modifiche rispetto alla situazione di partenza. Il cambiamento principale si ha solo grazie al cambio della classe di memorizzazione della variabile parola. 1. File di intestazione con i prototipi: intest.h /* inizio file di intestazione */ void CreaArray(int); char* Copia(void); void Inizializza(void);

11 void Cifratura(char *); void Visualizza(char *); void OrdinaParola(char*); void OrdinaStringa(char*); /* fine file di intestazione */ 2. File con le implementazioni e le direttive necessarie a tali implementazioni: impl.c /* inizio file con le implementazioni */ #include <stdio.h> #include <stdlib.h> #include <string.h> static char *parola; /* ora il campo di visibilità della variabile è esteso alle sole funzioni di impl.c. In assenza dello specificatore la variabile era visibile a tutto il codice (ovvero a tutti e tre i file). Grazie allo specificatore static ora essa è visibile SOLO alle funzioni implementate nei file appartenenti alla stessa unità di compilazione del file in cui è inserita la variabile. */ /* qui di seguito vengono inserite solo le NUOVE implementazioni */ void CreaArray(int numero_caratteri) {char *parola = NULL; if(numero_caratteri == 0) { printf("\n di quanti caratteri vuoi sia composta la stringa? -> "); scanf("%d", & numero_caratteri); } else if(numero_caratteri < 0) {printf("\n Il valore del parametro non è corretto -> il programma termina "); exit(0);} parola = (char*) malloc((numero_caratteri+1) * sizeof(char)); if(parola == NULL) {printf("\n l'allocazione di memoria non e\' riuscita! -> il programma viene terminato "); exit(0);} } char * Copia(void) {char *nuova_stringa = (char*) malloc(sizeof(char)*(strlen(parola)+1); if(nuova_stringa==null) {printf("copia fallita - il programma termina"); exit(0);} strcpy(nuova_stringa,parola); return nuova_stringa; } void Inizializza(void) {printf("inserisci una stringa di testo"); gets(parola); }

12 /* fine file con le implementazioni */ 3. File con main(): maincode.c /* inizio file con main()*/ #include <intest.h> {char *ordinata1,*ordinata2; /* viene allocata memoria per la stringa */ CreaArray(0); /* la stringa viene inizializzata */ Inizializza(); ordinata1 = Copia(); ordinata2 = Copia(); OrdinaChar(ordinata1); Visualizza(ordinata1); OrdinaParola(ordinata2); Visualizza(ordinata2); /* fine file con main() */ Ora posso compilare separatamente i vari moduli e poi unirli con il linker gcc -c maincode.c -o maincode.o gcc -c impl.c -o impl.o gcc impl.o maincode.o -o newprog Esercizio: trasformare il file mie_funzioni.h in una libreria vera e propria, composta da un file di intestazione e da un archivio con i codici oggetto alterare il codice di maincode.c ed inserire un'istruzione in cui viene modificata la

13 variabile parola: confrontare il caso in cui sia presenta lo specificatore static con quello in cui tale specificatore non sia presenta /* inizio file con main()*/ #include <intest.h> {char *ordinata1,*ordinata2; extern char* parola; /* questa istruzione produce un errore */ /* viene allocata memoria per la stringa */ CreaArray(0); /* la stringa viene inizializzata */ Inizializza(); parola=null; /* questa istruzione produce un errore */ ordinata1 = Copia(); ordinata2 = Copia(); OrdinaChar(ordinata1); Visualizza(ordinata1); OrdinaParola(ordinata2); Visualizza(ordinata2); /* fine file con main() */

da_costruire = da_costruire ^ 1; /* inserisco un bit nella prima posizione a destra */

da_costruire = da_costruire ^ 1; /* inserisco un bit nella prima posizione a destra */ Precisazione: int da_costruire = 0; da_costruire = da_costruire ^ 1; /* inserisco un bit nella prima posizione a destra -> 0000000000000001 (da_costruire vale 1) da_costruire = 0; da_costruire = da_costruire

Dettagli

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

prova.c #include <stdio.h> char funzione(char); codice oggetto del main() prova.c #include char funzione(char); {char c= a ; printf( Ecco il carattere: %c\n,c); c=funzione(c); printf( Ecco il carattere modificato: %c\n,c); char funzione(char tmp) {if(tmp

Dettagli

La direttiva #include

La direttiva #include La direttiva #include La definizione di una funzione-utente comporta alcuni passaggi: scelta e indicazione del prototipo della funzione implementazione della funzione Le funzioni della libreria standard

Dettagli

Indovina la lettera...

Indovina la lettera... Indovina la lettera... La lezione di oggi consiste nel preparare un programma che chiede all'utente di indovinare quale sia il carattere generato dal programma stesso in modo casuale. Il numero totale

Dettagli

Costruiamo un programma per crittografare del testo

Costruiamo un programma per crittografare del testo Costruiamo un programma per crittografare del testo Per codificare un messaggio in modo tale che il suo testo non risulti leggibile a persone che non siano in possesso dell'opportuna procedura di decodifica,

Dettagli

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013 Laboratorio di Programmazione 1 1 Docente: dr. Damiano Macedonio Lezione 4 24/10/2013 Original work Copyright Sara Migliorini, University of Verona Modifications Copyright Damiano Macedonio, University

Dettagli

Gli array. impone al programma, in fase di esecuzione, di riservare dello spazio in memoria per 10 variabili di tipo int

Gli array. impone al programma, in fase di esecuzione, di riservare dello spazio in memoria per 10 variabili di tipo int Gli array Gli array rappresentano una modalità molto compatta per accedere ad un gruppo di variabili; tale gruppo è identificato dal nome dell'array; i tipi delle variabili appartenenti al gruppo devono

Dettagli

Puntatori. Grazie ai puntatori:

Puntatori. Grazie ai puntatori: Puntatori Grazie ai puntatori: 1) è possibile permettere ad una funzione di modificare il contenuto di un area di memoria; 2) invece di passare ad una funzione tutto un blocco di memoria, si passa alla

Dettagli

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine) La copia di un file Nell'esercizio di oggi cerchiamo di implementare un programma che permetta di effettuare la copia di un file di testo. L'operazione di copia, oltre a permettere di creare un nuovo file

Dettagli

Le strutture /2. Iniziamo ora a progettare il codice per la gestione del database. Quali sono le funzionalità da implementare?

Le strutture /2. Iniziamo ora a progettare il codice per la gestione del database. Quali sono le funzionalità da implementare? Le strutture /2 Iniziamo ora a progettare il codice per la gestione del database. Quali sono le funzionalità da implementare? Per ora è possibile gestire l'elenco dei libri (e quindi delle strutture) mediante

Dettagli

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Dettagli

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

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto. Sistema C e organizzazione del codice Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto. Un programma C è costituito da un insieme

Dettagli

Lettura da tastiera e scrittura su monitor

Lettura da tastiera e scrittura su monitor Lettura da tastiera e scrittura su monitor Per poter leggere UN SINGOLO CARATTERE dalla tastiera e visualizzare UN SINGOLO CARATTERE sul monitor si possono utilizzare le funzioni: int getchar (void) (per

Dettagli

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Dettagli

Primi passi col linguaggio C

Primi passi col linguaggio C Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Come introdurre un linguaggio di programmazione? Obiettivi: Introduciamo una macchina astratta

Dettagli

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Dettagli

Il buffer di input. In questo modo, tutte le chiamate alla funzione permetteranno all'utente di inserire caratteri.

Il buffer di input. In questo modo, tutte le chiamate alla funzione permetteranno all'utente di inserire caratteri. Il buffer di input In C, l'input fornito dall'utente viene gestito mediante un buffer; nel buffer vengono inseriti i caratteri premuti dall'utente sulla tastiera e, a chiusura del buffer, viene aggiunto

Dettagli

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. Linguaggio C Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. 1 Funzioni Generalizzazione del concetto di funzione algebrica: legge che associa a valori delle variabili

Dettagli

I puntatori. Il C ci permette di conoscere tale indirizzo, ovvero di determinare dove la variabile sia stata effettivamente memorizzata.

I puntatori. Il C ci permette di conoscere tale indirizzo, ovvero di determinare dove la variabile sia stata effettivamente memorizzata. I puntatori La memoria RAM del calcolatore è formata da un insieme di celle di memoria; per poter localizzare ciascuna cella, ad ognuna di esse è associato un numero, ovvero il suo indirizzo, che viene

Dettagli

Preprocessore, linker e libreria standard

Preprocessore, linker e libreria standard Preprocessore, linker e libreria standard Università degli Studi di Brescia Prof. Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 IL PREPROCESSORE Programma sorgente

Dettagli

Dati due punti sul piano calcolare la loro distanza

Dati due punti sul piano calcolare la loro distanza Introduzione al C Primo esempio in C Dati due punti sul piano calcolare la loro distanza Soluzione: la distanza fra due punti si calcola secondo il teorema di Pitagora, con la formula: y Distanza = (lato12

Dettagli

Allocazione dinamica della memoria

Allocazione dinamica della memoria Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori

Dettagli

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

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina Il compilatore C Astrazione Linguaggio macchina implica la conoscenza dei metodi usati per la rappresentazione dell informazioni nella CPU Linguaggio Assembly è il linguaggio delle istruzioni che possono

Dettagli

Linguaggi di programmazione

Linguaggi di programmazione Lezione 1 e 2 Fabio Scotti Laboratorio di programmazione per la sicurezza 1 Lezione 1 e 2 Fabio Scotti Laboratorio di programmazione per la sicurezza Introduzione al linguaggio C e significato della compilazione

Dettagli

Introduzione al linguaggio C. Emilio Di Giacomo

Introduzione al linguaggio C. Emilio Di Giacomo Introduzione al linguaggio C Emilio Di Giacomo Programmi in C In questa lezione vedremo come scrivere programmi in C i programmi che vedremo saranno molto semplici ci permetteranno comunque di illustrare

Dettagli

Passaggio dei parametri

Passaggio dei parametri Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei parametri così passati non si riflettono sull environment

Dettagli

Introduzione al C. Unità 10 Preprocessore. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Introduzione al C. Unità 10 Preprocessore. D. Bloisi, S. Peluso, A. Pennisi, S. Salza Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 10 Preprocessore D. Bloisi, S. Peluso, A. Pennisi, S. Salza Sommario Processo

Dettagli

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

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma. Unità Didattica 1 Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C UNIX (1969) - DEC PDP-7 Assembly Language BCPL - un OS facilmente accessibile che fornisce potenti strumenti

Dettagli

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità Funzioni I Parte Indice Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità Le funzioni: la dichiarazione

Dettagli

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

Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file Compilazione separata Come realizzare correttamente un piccolo progetto su piu' file 1 Programmi C su più file Tutti i programmi che abbiamo visto finora erano composti da un unico file.c Nel caso di programmi

Dettagli

L AMBIENTE CODE BLOCKS E L IO

L AMBIENTE CODE BLOCKS E L IO L AMBIENTE CODE BLOCKS E L IO Il primo programma #include main() { printf("ciao Mondo!"); } Il file deve essere salvato con estensione.c Il primo programma in C++ #include using

Dettagli

Linguaggio di Riferimento: C

Linguaggio di Riferimento: C Programmazione procedurale Linguaggio di Riferimento: C 1 Linguaggio macchina Il linguaggio macchina costituisce la forma espressiva atta a descrivere programmi e ad essere direttamente interpretata dall

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017

Dettagli

Introduzione al C. Unità 10 Preprocessore

Introduzione al C. Unità 10 Preprocessore Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 10 Preprocessore D. Bloisi, A. Pennisi, S. Peluso, S. Salza Processo di compilazione

Dettagli

Primi passi Output formattato Le quattro operazioni. Programmazione 1. Lezione 2 Parte 2. Vincenzo Marra.

Primi passi Output formattato Le quattro operazioni. Programmazione 1. Lezione 2 Parte 2. Vincenzo Marra. Programmazione 1 Lezione 2 Parte 2 Vincenzo Marra vincenzo.marra@unimi.it Dipartimento di Matematica Federigo Enriques Università degli Studi di Milano 12 marzo 2014 Struttura del sorgente Un programma

Dettagli

Il linguaggio C. Notate che...

Il linguaggio C. Notate che... Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione

Dettagli

Università degli Studi di Ferrara

Università degli Studi di Ferrara Università degli Studi di Ferrara Corso di Laurea in Matematica - A.A. 2017-2018 Programmazione Lezione 4 il Linguaggio C Docente: Michele Ferrari - michele.ferrari@unife.it Nelle lezioni precedenti Problemi

Dettagli

Tempo di vita e scope delle variabili

Tempo di vita e scope delle variabili Tempo di vita e scope delle variabili Richiami sulla struttura di un programma C Un programma C deve essere contenuto in uno o più file (salvo diversa specifica, per ora si assume tutto in un unico file):

Dettagli

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22 Lezione 21 e 22 - Allocazione dinamica delle matrici - Generazione di numeri pseudocasuali - Funzioni per misurare il tempo - Parametri del main - Classificazione delle variabili Valentina Ciriani (2005-2008)

Dettagli

Fondamenti di Informatica. Ingegneria elettronica

Fondamenti di Informatica. Ingegneria elettronica Fondamenti di Informatica Ingegneria elettronica Prima esercitazione Cecilia Catalano Sistema Operativo Il S.O. è costituito da un insieme di programmi che permettono di utilizzare e gestire tutte le risorse

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Classi di memorizzazione

Classi di memorizzazione Classi di memorizzazione 1 Classi di memorizzazione Definiscono le regole di visibilità delle variabili e delle funzioni quando il programma è diviso su più file Stabiliscono dove (in quale parte dello

Dettagli

Il generatore di numeri casuali

Il generatore di numeri casuali Il generatore di numeri casuali file di libreria: stdlib.h int rand(void) La funzione restituisce un numero casuale di tipo intero compreso tra 0 e RAND_MAX (estremi compresi) Esempio: scriviamo un programma

Dettagli

Corso sul linguaggio Java

Corso sul linguaggio Java Corso sul linguaggio Java Modulo JAVA2 2.1- Funzioni 1 Prerequisiti Programmazione elementare in Java Tecnica top-down Concetto matematico di funzione Compilazione e link di programmi Esecuzione di funzioni

Dettagli

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

Primo passo: il preprocessor. Il preprocessore. Esempi di direttive al preprocessore: #include. Esempi di direttive al preprocessore: #define Primo passo: il preprocessor Source code Preprocessor Pre-processed source code Compiler Libraries Linker Executable code 1 Il preprocessore Il preprocessore compie delle manipolazioni sul codice del programma.

Dettagli

Programmazione di base

Programmazione di base Fondamenti di Informatica Quinto Appello 016-1 1 Luglio 01 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene 10 domande,

Dettagli

Costruiamo un'immagine o qualcosa di simile.

Costruiamo un'immagine o qualcosa di simile. Costruiamo un'immagine...... o qualcosa di simile. Se consideriamo la C che si trova in fondo a destra, ci accorgiamo che un'immagine non è altro che una tabella di valori. Nel caso in cui si consideri

Dettagli

Lezione IX Gestione dinamica della memoria

Lezione IX Gestione dinamica della memoria Programmazione e Laboratorio di Programmazione Lezione IX Gestione dinamica della memoria Programmazione e Laboratorio di Programmazione: Gestione dinamica della memoria 1 Direttiva per il preprocessore

Dettagli

Modulo 2: Strutture fondamentali della programmazione Java

Modulo 2: Strutture fondamentali della programmazione Java Modulo 2: Strutture fondamentali della programmazione Java Argomenti Trattati: Un semplice programma Java: Presentazione di un primo Esempio; Introduzione alla struttura; Compilazione ed esecuzione. Argomenti

Dettagli

Funzioni dipendenti dal tipo definite al momento dell'uso

Funzioni dipendenti dal tipo definite al momento dell'uso Nome File : Liste.h typedef char* Elem; typedef struct nodo* ListeP; /* premettiamo le funzioni che dipendono dal tipo e il cui codice sarà introdotto nel file di utilizzo della lista*/ int confr(elem

Dettagli

Programmazione di base

Programmazione di base Fondamenti di Informatica Sesto Appello 016-17 11 Settembre 017 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene 10 domande,

Dettagli

L AMBIENTE CODE BLOCKS E L IO

L AMBIENTE CODE BLOCKS E L IO L AMBIENTE CODE BLOCKS E L IO Il primo programma in C++ #include using namespace std; main() { cout

Dettagli

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

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} } ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il

Dettagli

Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2007/08 Tutor: Barbara Pettazzoni

Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2007/08 Tutor: Barbara Pettazzoni Fondamenti di Informatica L-B (L-Z) Esercitazioni A.A. 2007/08 Tutor: Barbara Pettazzoni barbara.pettazzoni@studio.unibo.it Informazioni Utili Orario delle Esercitazioni Martedì 14-16 Gruppo L Q Martedì

Dettagli

STRUTTURA DI UN PROGRAMMA!

STRUTTURA DI UN PROGRAMMA! STRUTTURA DI UN PROGRAMMA! File prova1.c Area globale #include ... int m; int f(int); int g(int x){.../*ambiente locale a g*/} int main(){...} int f(int x){.../*ambiente locale a f*/} Direttive

Dettagli

IL PRIMO PROGRAMMA IN C

IL PRIMO PROGRAMMA IN C IL PRIMO PROGRAMMA IN C LO SCOPO Si vuole scrivere un programma in linguaggio C che chieda all utente di introdurre da tastiera due numeri interi e visualizzi il valore della loro somma sul video SOLUZIONE

Dettagli

Le direttive del Preprocessore

Le direttive del Preprocessore Le direttive del Preprocessore Prof. Orazio Mirabella Direttive Un compilatore traduce le istruzioni di un programma sorgente in linguaggio macchina Talvolta è conveniente prendere coscienza dell esistenza

Dettagli

Dichiarazioni e tipi predefiniti nel linguaggio C

Dichiarazioni e tipi predefiniti nel linguaggio C Politecnico di Milano Dichiarazioni e tipi predefiniti nel linguaggio C Variabili, costanti, tipi semplici, conversioni di tipo. Premessa Programmi provati sul compilatore Borland C++ 1.0 Altri compilatori:

Dettagli

Corso di Informatica A.A

Corso di Informatica A.A Corso di Informatica A.A. 2009-2010 Lezione 11 Corso di Informatica 2009-2010 Lezione 11 1 Utilizzo dei puntatori Funzioni Perche i Puntatori? I puntatori hanno tre importanti applicazioni: 1. Passaggio

Dettagli

#include <stdio.h> main() { - 1 -

#include <stdio.h> main() { - 1 - Un primo esempio di programma Ogni programma C deve contenere una funzione speciale chiamata main che indica il punto in cui inizia l esecuzione del programma. La funzione main è unica all interno di ogni

Dettagli

Cosa serve per cominciare?

Cosa serve per cominciare? Cosa serve per cominciare? La linea di comando Il notepad (o equivalente) Saper scrivere qualcosa a video da programma risultato dell elaborazione elaborazione Ma come si fa?! 1 Input / Output L'immissione

Dettagli

Linguaggi di Programmazione

Linguaggi di Programmazione Linguaggi di Programmazione 1 C-Introduzione.tex: Versione 1.0, aa 2005-2006 Linguaggi di programmazione (1) Sono linguaggi che permettono la codifica di algoritmi in modo da renderli eseguibili, direttamente

Dettagli

Progetti su più File Sorgenti

Progetti su più File Sorgenti Progetti su più File Sorgenti Sono considerate applicazioni di piccola dimensione, applicazioni con qualche migliaio di linee di codice Un applicazione anche di piccola dimensione non può essere sviluppata

Dettagli

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione Introduzione a Funzioni di Ingresso e Uscita Compilazione 2 Come si termina...... un programma in esecuzione (processo)? Ctrl + C In UNIX ci si basa sul concetto di terminale Anche da GUI, quello che si

Dettagli

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

Compilazione separata. Come realizzare correttamente un piccolo progetto su piu' file Compilazione separata Come realizzare correttamente un piccolo progetto su piu' file 1 Programmi C su più file Tutti i programmi che abbiamo visto finora erano composti da un unico file.c Nel caso di programmi

Dettagli

Informazioni Utili. Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2005/06 Tutor: Loris Cancellieri

Informazioni Utili. Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2005/06 Tutor: Loris Cancellieri Fondamenti di Informatica L-B (L-Z) Esercitazioni A.A. 2005/06 Tutor: Loris Cancellieri loris.cancellieri@studio.unibo.it Informazioni Utili Orario delle Esercitazioni Lunedì 14-16 Gruppo L Q Martedì 16-18

Dettagli

Rappresentazione binaria delle variabili (int e char)

Rappresentazione binaria delle variabili (int e char) Rappresentazione binaria delle variabili (int e char) int e char son i due tipi utilizzati dal linguaggio C per la rappresentazione di valori interi; ai valori delle variabili del primo tipo sono assegnati

Dettagli

Corso di Reti di Calcolatori L-A

Corso di Reti di Calcolatori L-A Università degli Studi di Bologna Facoltà di Ingegneria Corso di Reti di Calcolatori L-A Esercitazione 9 (svolta) RPC: Inizializzazione Strutture Dati sul Server Luca Foschini Anno accademico 2010/2011

Dettagli

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria. Puntatori I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria. NOTA: quando un programma viene mandato in esecuzione, ad esso viene assegnata un area di memoria di lavoro

Dettagli

deve conoscerne solo l interfaccia:

deve conoscerne solo l interfaccia: Progetti su più File Sorgenti Sono considerate applicazioni i i di piccola dimensione, applicazioni con qualche migliaio di linee di codice Un applicazione anche di piccola dimensione non può essere sviluppata

Dettagli

Lezione 8: Stringhe ed array multidimensionali

Lezione 8: Stringhe ed array multidimensionali Lezione 8: Stringhe ed array multidimensionali Vittorio Scarano Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione AVVISO: la lezione di laboratorio di 28/5 non si

Dettagli

Lezione IX Gestione dinamica della memoria

Lezione IX Gestione dinamica della memoria Programmazione e Laboratorio di Programmazione Lezione IX Gestione dinamica della memoria Programmazione e Laboratorio di Programmazione: Gestione dinamica della memoria 1 Operatore sizeof() Buffer: una

Dettagli

Lezione 5: Introduzione alla programmazione in C

Lezione 5: Introduzione alla programmazione in C Lezione 5: Introduzione alla programmazione in C Laboratorio di Elementi di Architettura e Sistemi Operativi 4 Aprile 2012 Introduzione al C C vs. Java Java: linguaggio ad oggetti C: linguaggio procedurale

Dettagli

Lezione XI Le stringhe

Lezione XI Le stringhe Programmazione e Laboratorio di Programmazione Lezione XI Le stringhe Programmazione e Laboratorio di Programmazione: Le stringhe 1 Premessa: Il tipo char Dimensione: 1 byte Range: da 0 a 255 Definizione:

Dettagli

Perché usare UniversiBO?

Perché usare UniversiBO? Perché usare UniversiBO? Fondamenti di Informatica L-B (L-Z) Esercitazioni A.A. 2007/08 Tutor: Barbara Pettazzoni barbara.pettazzoni@studio.unibo.it Il vostro dubbio puó essere il dubbio di vostri colleghi

Dettagli

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei parametri così passati non si riflettono sull environment esterno Per riferimento

Dettagli

$QDOLVLGHOSURJUDPPDTXDGUDWR

$QDOLVLGHOSURJUDPPDTXDGUDWR $QDOLVLGHOSURJUDPPDTXDGUDWR /* */ calcolare l area del quadrato #include main(){ int lato, area; printf("lato "); scanf("%d", &lato); if(lato < 0) printf("errore nei dati \n"); else { area =

Dettagli

Input/Output su disco

Input/Output su disco Input/Output su disco In C, la gestione dei dispositivi di lettura (tastiera, file su disco,...) e scrittura (monitor, file su disco, stampante,...) viene effettuata mediante canali di comunicazione. Tali

Dettagli

Variabili e Funzioni. Informatica 1 / 19

Variabili e Funzioni. Informatica 1 / 19 Variabili e Funzioni Informatica 1 / 19 Programmi C e Un programma C e composto da funzioni e variabili Variabile: memorizza valori appartenenti ad un insieme di definizione (dipendente dal tipo) Funzione:

Dettagli

File binari e file di testo

File binari e file di testo I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file

Dettagli

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

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali AMBIENTE LOCALE E GLOBALE In C, ogni funzione ha il suo ambiente locale che comprende i parametri e le variabili definite localmente alla funzione Esiste però anche un ambiente globale: quello dove tutte

Dettagli

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

Esiste però anche un ambiente globale: quello dove tutte le funzioni sono definite. Qui si possono anche definire variabili, dette variabili globali AMBIENTE LOCALE E GLOBALE In C, ogni funzione ha il suo ambiente locale che comprende i parametri e le variabili definite localmente alla funzione Esiste però anche un ambiente globale: quello dove tutte

Dettagli

Programmazione di base

Programmazione di base Fondamenti di Informatica Quarto Appello 016-17 4 luglio 017 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene 10 domande,

Dettagli

PROGETTI SU PIU` FILE

PROGETTI SU PIU` FILE PROGETTI SU PIU` FILE Un applicazione complessa non può essere fatta in un unico file.c: sarebbe ingestibile Meglio dividerla in vari moduli, che si occupano di aspetti diversi Ordinamento Interfaccia

Dettagli

La gestione dei caratteri in C

La gestione dei caratteri in C in C In C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit) Ad ogni carattere corrisponde un codice numerico ASCII (American Standard Code for Information Interchange) Un esempio

Dettagli

L'Allocazione Dinamica della Memoria nel linguaggio C

L'Allocazione Dinamica della Memoria nel linguaggio C L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego riochierego@libero.it http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria

Dettagli

Prova Scritta del 20/09/10

Prova Scritta del 20/09/10 Avvertenze Usare ESCLUSIVAMENTE penne ad inchiostro nero o blu (NO MATITE). Consegnare solo fogli formato A4 scritti da solo da un lato se si vogliono avere le fotocopie del compito. In testa a ciascun

Dettagli

Laboratorio di Informatica I

Laboratorio di Informatica I Struttura della lezione Lezione 6: Array e puntatori Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Una funzione per i numeri di Fibonacci

Dettagli

STRUTTURA DI UN PROGRAMMA

STRUTTURA DI UN PROGRAMMA STRUTTURA DI UN PROGRAMMA File prova1.c #include ... int m; int f(int); int g(int x){ Area globale Direttive Dichiarazioni globali e prototipi di funzioni Definizioni di funzioni.../*ambiente

Dettagli

Primo programma in C

Primo programma in C Primo programma in C Struttura minima di un file C Applicazioni C in modo console Struttura del programma Commenti Direttive #include Definizione di variabili Corpo del main 2 Struttura minima di un file

Dettagli

Elementi di informatica. Programmare in C

Elementi di informatica. Programmare in C Elementi di informatica Programmare in C 1 Programmare in C 2 Calcolare l area di un rettangolo /* Calcolo area rettangolo */ #include main() { int base; int altezza; int area; Conosciamo base

Dettagli

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili Lo scopo 2 Il primo esperimento Si vuole scrivere un programma in linguaggio C che chieda all utente di introdurre da tastiera due numeri interi e visualizzi il valore della loro somma sul video Ver. 2.4

Dettagli

Lezione 6: Array e puntatori

Lezione 6: Array e puntatori Lezione 6: Array e puntatori Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione Una funzione per i numeri di Fibonacci

Dettagli

Puntatori e array. Violetta Lonati

Puntatori e array. Violetta Lonati Puntatori e array Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati Puntatori e array

Dettagli