Il processo di compilazione
|
|
- Ortensia Savino
- 5 anni fa
- Visualizzazioni
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 */
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
Dettagliprova.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
DettagliLa 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
DettagliIndovina 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
DettagliCostruiamo 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,
DettagliLaboratorio 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
DettagliGli 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
DettagliPuntatori. 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
DettagliLa 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
DettagliLe 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
DettagliPerché 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
DettagliIl 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
DettagliLettura 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
DettagliPerché 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
DettagliPrimi 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
DettagliC: 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
DettagliIl 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
DettagliLinguaggio 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
DettagliI 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
DettagliPreprocessore, 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
DettagliDati 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
DettagliAllocazione 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
DettagliEsempio. 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
DettagliLinguaggi 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
DettagliIntroduzione 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
DettagliPassaggio 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
DettagliIntroduzione 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
DettagliUnità 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
DettagliLe 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
DettagliCompilazione 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
DettagliL 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
DettagliLinguaggio 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
DettagliIntroduzione 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
DettagliIntroduzione 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
DettagliPrimi 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
DettagliIl 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
DettagliUniversità 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
DettagliTempo 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):
DettagliLezione 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)
DettagliFondamenti 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
DettagliIl 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;
DettagliClassi 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
DettagliIl 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
DettagliCorso 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
DettagliPrimo 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.
DettagliProgrammazione 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,
DettagliCostruiamo 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
DettagliLezione 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
DettagliModulo 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
DettagliFunzioni 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
DettagliProgrammazione 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,
DettagliL AMBIENTE CODE BLOCKS E L IO
L AMBIENTE CODE BLOCKS E L IO Il primo programma in C++ #include using namespace std; main() { cout
DettagliERRATA 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
DettagliFondamenti 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ì
DettagliSTRUTTURA 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
DettagliIL 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
DettagliLe 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
DettagliDichiarazioni 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:
DettagliCorso 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 -
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
DettagliCosa 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
DettagliLinguaggi 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
DettagliProgetti 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
DettagliIntroduzione 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
DettagliCompilazione 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
DettagliInformazioni 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
DettagliRappresentazione 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
DettagliCorso 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
DettagliI 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
Dettaglideve 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
DettagliLezione 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
DettagliLezione 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
DettagliLezione 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
DettagliLezione 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:
DettagliPerché 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
DettagliPassaggio 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 /* */ 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 =
DettagliInput/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
DettagliVariabili 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:
DettagliFile 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
DettagliEsiste 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
DettagliEsiste 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
DettagliProgrammazione 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,
DettagliPROGETTI 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
DettagliLa 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
DettagliL'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
DettagliProva 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
DettagliLaboratorio 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
DettagliSTRUTTURA 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
DettagliPrimo 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
DettagliElementi 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
DettagliLo 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
DettagliLezione 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
DettagliPuntatori 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