Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Programmazione Avanzata Java e C Lezione 18: Alcuni aspetti del C …cose misteriose che è utile sapere 30 October 2014 Annuncio 0: ð Giovedì 30/10 ci sarà lezione “normale” in Sala Consiliare ð Lunedì 3/11 si va in Mlab 2 ð Orari invariati Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 2 1 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Annuncio 1: Cari colleghi, desidero informarvi che le biblioteche dell'ateneo stanno organizzando per la prima settimana di novembre incontri di presentazione dei servizi offerti dal sistema bibliotecario di ateneo. L'iniziativa è rivolta alle matricole e a coloro che non hanno dimestichezza con i servizi bibliotecari Prego i docenti dei primi anni di corso di diffondere la comunicazione, di invitare gli studenti a partecipare e ad inviare una mail ([email protected]) alla biblioteca di ingegneria per iscriversi. I dettagli dell'iniziativa sono stati pubblicati sul portale, nelle news delle biblioteche. http://www.unibs.it/biblioteche/biblioteca-di-ingegneria Ringrazio per l'attenzione e porgo cordiali saluti Emilio Lezione 18 Alcuni aspetti del C 30 October 2014 3 Annuncio 2: Cari colleghi, il pomeriggio del 6 novembre a partire dalle 14 si terrà, nell'aula magna di Ingegneria, l'Olivetti Day, organizzato da Superpartes a cui parteciperà Federico Faggin, l'inventore del microprocessore. L’evento è particolarmente gradito proprio per la presenza di Federico Faggin. Vi invito a partecipare e a trasmettere tale informazione agli studenti durante le vostre ore di lezione. Per la partecipazione è richiesta la registrazione, da effettuarsi al seguente sito web: http://www.olivettiday.it/ Un caro saluto Emilio Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 4 2 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Un breve promemoria: Numero (intero) 0000 0000 0000 0001 0100 0011 0110 0111 1111 1111 1000 0001 1000 0000 unsigned 0 1 67 103 255 129 128 signed 0 1 67 103 -1 -127 -128 Lo stesso numero (binario) può essere interpretato in molti modi diversi Lezione 18 Alcuni aspetti del C char <NUL> <SOH> C g ü Ç Convenzionale! 30 October 2014 5 Ma il tipo char cosa rappresenta? ð Numeri, nient’altro che numeri… ð …a cui possiamo attribuire una codifica ð A=65, B=66, C=67, … ð Usiamo la codifica ASCII ð Ma possiamo fare le cose più “turpi”: char carattere, numero_ordine; carattere='C'; numero_ordine = carattere-'A' + 1; ð Oppure char maiuscolo, minuscolo; maiuscolo=minuscolo - 'a' + 'A'; caratteri Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 7 3 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Definizioni, dichiarazioni, e inizializzazioni ð Dichiarazione: dice al compilatore di che tipo è il dato ● extern int var1; extern char vett[7]; ð Definizione: dice al compilatore che si userà quel dato, in modo che il compilatore possa assegnare la memoria occorrente (dipendente dal tipo di dato); ● ● Quasi sempre contestuale alla dichiarazione int var1; char vett[7]; ð Assegnamento: assegna un valore al dato ● var1=4; vett[3]='E'; i++; ð Inizializzazione: definizione e assegnamento contestuali ● int var2=7; char lettere[]={'c', 'i', 'a', 'o'}; char lettere[]={"ciao"}; Lezione 18 Alcuni aspetti del C 30 October 2014 8 I tipi floating point ð Non dimenticate mai i numeri floating point rappresentano le quantità in maniera approssimata, anche se la precisione può essere assai grande. ● La precisione dipende fra l’altro dal calcolatore utilizzato ð Fate molta attenzione alle uguaglianze! ● Non è detto che a / b * b == a ð In C, il trattamento standard dei numeri floating point è molto efficiente ma poco preciso ● Può essere necessario usare librerie apposite Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 9 4 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Altri tipi di dati ð Predefiniti: ● ● ● ● Puntatori Vettori Stringhe (ma il tipo stringa non esiste!) Enumerazioni ð Definiti dall’utente: ● ● ● Typedef Struct Funzioni Lezione 18 Alcuni aspetti del C 30 October 2014 10 Le costanti ð Come le variabili, hanno un tipo, che è determinato dal loro valore e dai caratteri prefissi e suffissi ● Intere • Ottali, esadecimali, decimali, long, … ● Carattere • • • • ● 'q' ATTENZIONE! Non "q" ! E l’apostrofo come lo rappresento? \' E il carattere “a capo”? \n Floating point • 1234.765; ● 13.4e-4 Queste cose vanno studiate e ricordate! Enumerazione • Ne parleremo più avanti Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 11 5 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Punto importante: ð Le costanti sono in realtà variabili come le altre, tranne per il fatto che il compilatore sa che sono costanti e quindi che non sono lvalue ð Ma lo sa solo il compilatore! Più avanti vedremo che il loro valore può essere alterato da programmi scritti con abilità diabolica… Lezione 18 Alcuni aspetti del C 30 October 2014 12 A proposito di costanti literal: ð Il loro tipo è desunto automaticamente dal loro valore: ● ● ● 123 è int 123. è float 2147483648 è long int ð Ma può essere modificato ● ● ● ● 1234 1234l 1234u 1234ul Lezione 18 Alcuni aspetti del C 30 October 2014 int 1234L long int 1234U unsigned int unsigned long int 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 13 6 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Tabellina riassuntiva: 75 75u 75l 75ul // // // // int unsigned int long unsigned long 3.14159L 6.02e23f // long double // float Lezione 18 Alcuni aspetti del C 3.14159 6.02e23 1.6e-19 3.0 3. 0.3 .3 // // // // // // // 3.14159 6.02 x 10^23 1.6 x 10^-19 3.0 3.0 0.3 0.3 75 0113 0x4b // decimal // octal // hexadecimal 30 October 2014 14 E inoltre provate questo programma: printf printf printf printf printf printf printf printf printf printf Lezione 18 Alcuni aspetti del C 30 October 2014 (" 1 (" 2 (" 3 (" 4 (" 5 (" 6 (" 7 (" 8 (" 9 ("10 %f %d %f %d %f %d %f %d %f %d \n", \n", \n", \n", \n", \n", \n", \n", \n", \n", 10 / 3 * 3); 10 / 3 * 3); 10. / 3 * 3); 10. / 3 * 3); 10 / 3. * 3); 10 / 3. * 3); 10 / 3 * 3.); 10 / 3 * 3.); 10. / 3. * 3.); 10. / 3. * 3.); 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 15 7 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C I vettori ð Aggregati di elementi tutti uguali fra loro, ordinati a matrice ð Indicati con il tipo dell’elemento base e le parentesi quadre: ● ● int vettore[5]; float altro_vettore[7][14]; ð Se si dichiarano in una inizializzazione, è possibile omettere la dichiarazione del numero di elementi ● int xx[]={11,22,33,44,55,66}; ð Ma non si possono creare ambiguità: ● ● int xx[] []={11,22,33,44,55,66}; è una matrice 2*3 o 3*2? int xx[2] [3]={11,22,33,44,55,66}; va bene ð Gli indici vanno da 0 a N-1 ð Ricordare: la memoria del calcolatore è divisa in celle. Ogni cella ha un indirizzo univoco. ð Qualunque sia il numero di dimensioni della matrice, essa viene sempre memorizzata in un vettore unidimensionale! Lezione 18 Alcuni aspetti del C 30 October 2014 16 Gli elementi dei vettori ð Gli elementi che identificano un elemento del vettore sono solo: ● ● L’indirizzo del primo elemento La formula per calcolare l’offset dell’elemento cercato ð Vettore unidimensionale a[N]: ● ● Offset (ai) = sizeof a0 * i Indirizzo (ai) = indirizzo (a0) + (sizeof a0 * i) ð Vettore bidimensionale a[M][N]: ● ● Offset (ai,j) = (sizeof a0,0 * N * i) + (sizeof a0,0 * j) Indirizzo (ai,j) = indirizzo (a0,0) + (sizeof a0,0 * N * i) + (sizeof a0,0 * j) ð Poi le cose si complicano: ● ● For a three-dimensional array, the formula to compute the offset into memory is the following: Address = Base + ((depthindex*col_size+colindex) * row_size + rowindex) * Element_Size Col_size is the number of items in a column, row_size is the number of items in a row. In C/C++, if you've declared the array as "type A[i] [j] [k];" then row_size is equal to k and col_size is equal to j. For a four dimensional array, declared in C/C++ as "type A[i] [j] [k] [m];" the formula for computing the address of an array element is Address =Base + (((LeftIndex * depth_size + depthindex)*col_size+colindex) * row_size +rowindex) * Element_Size Depth_size is equal to j, col_size is equal to k, and row_size is equal to m. LeftIndex represents the value of the leftmost index. Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 17 8 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Due operatori strani: ð Operatore & ● restituisce l’indirizzo fisico della prima cella di memoria occupata dalla variabile o dalla funzione a cui è applicato ð Operatore sizeof ● restituisce il numero di byte occupato da un oggetto del tipo del proprio operando Lezione 18 Alcuni aspetti del C 30 October 2014 18 Assegnamenti e inizializzazioni dei vettori ð La dimensione può essere dichiarata implicitamente ● ● ● int xx[]={11,22,33,44,55,66}; char yy[]={'C','i','a','o'}; char zz[]="Ciao"; ð La dichiarazione esplicita ha SEMPRE il sopravvento ● ● ● int xx[100]={11,22,33,44,55,66}; char yy[100]={'C','i','a','o'}; char zz[100]="Ciao"; ð Anche quando è sbagliata! ● ● ● int xx[4]={11,22,33,44,55,66}; char yy[2]={'C','i','a','o'}; char zz[3]="Ciao"; Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 19 9 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Ancora sull’allocazione: ð Occorre fare molta attenzione alle dimensioni del vettore allocato ð Il compilatore fa pochi controlli (per risparmiare tempo)! Dimensione_vettori Lezione 18 Alcuni aspetti del C 30 October 2014 20 Inoltre, molto importante: ð Non viene fatto nessun controllo sulla validità dell’elemento indirizzato ● Per motivi di efficienza, ovviamente ð Se leggete un elemento che non esiste, ricavate dati assurdi ð Se scrivete un elemento che non esiste, rischiate di sporcare altri dati o addirittura di alterare il programma con effetti che possono essere terribili! ● ● Per fortuna esiste il meccanismo di protezione della memoria Ma attenzione: funziona solo all’esterno del vostro programma vettori2 Lezione 18 Alcuni aspetti del C 30 October 2014 vettori1 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 21 10 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Un cenno alla funzione printf ð http://www.cplusplus.com/reference/clibrary/cstdio/ printf/ ð int printf ( const char * format, ... ); Lezione 18 Alcuni aspetti del C 30 October 2014 22 Costanti e variabili stringa ð Ne parleremo più avanti diffusamente ● ● ● ● ● Per ora, una stringa è un vettore di caratteri Per ogni stringa è allocato un certo numero di byte, ma la stringa non li occupa necessariamente tutti Per capire dove la stringa finisce, conveniamo che essa termini sempre con il carattere \0 (0x00) Quindi una stringa di n caratteri occupa sempre n+1 byte, ma la memoria ad essa allocata potrebbe essere di più Le costanti stringa vengono indicate da una stringa di caratteri alfanumerici racchiusa fra doppi apici: • "buongiorno" • "buonanotte\n" ● Il terminatore viene aggiunto automaticamente Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 23 11 Programmazione Avanzata Java e C 2014-‐2015 Lezione 18 Alcuni aspeA del C Un altro tipo inesistente: ð Il tipo boolean ● ● ● È rappresentato da qualunque tipo intero Il valore false è rappresentato dal valore 0 Il valore true è rappresentato da qualunque valore ≠0 truefalse Lezione 18 Alcuni aspetti del C 30 October 2014 30 October 2014 © 2013 -‐ 2016 Riccardo Cassinis -‐ TuA i diriA riservaG 24 12
© Copyright 2025 ExpyDoc