Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze...

32
Laboratorio di Linguaggi lezione IV Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2004/05

Transcript of Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze...

Page 1: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

Laboratorio di Linguaggi

lezione IV

Marco Tarini

Università dell’Insubria

Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese

Corso di Laurea in Informatica

Anno Accademico 2004/05

Page 2: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Laboratorio di Linguaggi

• docente: Marco Tarini e-mail: [email protected]

• ricevimento: Martedì 14:30 - 17:30o anche su appuntamento

• libro di testo consigliato:Kelley Al, Pohl Ira:"C Didattica e Programmazione" ("A Book on C")quarta edizione - anche la terza va bene

Page 3: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: operazioni a basso livello

Esercizio:

• Sappiamo che un double occupa 8 bytes.• Dato un double, quale è il valore di questi

8 bytes?• Per esempio, quali 8 bytes compongono il

valore 3.14159256 ?

un numero in virgola mobilea doppia precisione

di solito, ma dipende dall'implementazione

Page 4: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: operazioni a basso livello

• A casa, provate questo programma, e scopriamo:– quali sono gli 8 bytes che compongono il double 3.14159256– quali sono gli 8 bytes che compongono il double 6.022 x 1023

• e, adattando il programma agli interi:– quali sono i 4 bytes che compongono l'int +1000000

– quali sono i 4 bytes che compongono l'int +1

– quali sono i 4 bytes che compongono l'int -1

• a seconda di quale architettura viene usata, potremmo trovare risposte diverse!– domanda: sarebbe potuto succedere in Java?

Page 5: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori

• Molto potenti...– vettori di dimensione determinata

dinamicamente– passaggio di parametri per riferimento

• in un linguaggio che prevede passaggio solo per copia

– possibilità di scrivere codici più efficienti– controllo diretto delle risorse, a basso livello– strutture dati flessibili

Page 6: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori

• Molto potenti...

"Ad un grande potere corrisponde una grande responsabilità."

– lo zio di Spiderman

Page 7: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• memory leak (“falla di memoria”)

int una_funzione (){ int *un_puntatore; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* fine della funzione */ return 0;}

Manca la deallocazione! ( free(un_puntatore); )

All'uscita della funzione il puntatore "un_puntatore" è perso per sempre, e con lui la possibilità di liberare ("sprenotare", per così dire) la memoria.Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria

Page 8: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• un altro caso di memory leak

... int *un_puntatore; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* rialloco un altro vettore */ un_puntatore = (int*)calloc( 100, sizeof(int));

Manca la deallocazione! ( free(un_puntatore); )

Anche qui, il puntatore "un_puntatore" è perso per sempre, econ lui la possibilità di liberare ("sprenotare", per così dire) la memoria.Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria

Page 9: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• un altro caso di memory leak

... int *un_puntatore, i; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* rialloco un altro vettore */ un_puntatore = &i;

Manca la deallocazione! ( free(un_puntatore); )

Anche qui, il puntatore "un_puntatore" è perso per sempre, econ lui la possibilità di liberare ("sprenotare", per così dire) la memoria.Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria

Page 10: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• stale pointer (“puntatore andato a male”)

/* funzione che restituisce un puntatore ad un intero */int* una_funzione (){ int *punt; int x=10; ... return &x; /* restituisci il puntatore che punta alla variabile x */}

la variabile x non sopravvive al termine della funzione!

l'indirizzo di memoria &x non è più valido allora!

Page 11: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• dereferenced NULL

int *punt = NULL; * punt = 10;

Errore, ma nessun disastro, il sistema se ne accorge in run time (hopefully)...

L’esecuzione terimina (con un segmentation fault)

Page 12: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• dangling pointers (puntatori penzolanti)

int *punt ; * punt = 10;

chissà in che locazione verrà scritto quel dieci...

Page 13: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• overrun screw (indicizzare oltre i boundaries)

int *punt = (int*) calloc(5,sizeof(int)); punt[5] = 10;

chissà in che locazione verrà scritto quel dieci...

Page 14: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• overrun screw (indicizzare oltre i boundaries)

int punt[ 5 ]; punt[5] = 10;

chissà in che locazione verrà scritto quel dieci...

Page 15: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• fandango on core (andare con un puntatore oltre i boundaries)

int *punt = (int*) malloc(sizeof(int)); * punt[5] = 10;

chissà in che locazione verrà scritto quel dieci...

punt ++; * punt = 10;

Page 16: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• uso dopo deallocazione

chissà in che locazione verrà scritto quel dieci...

int *punt = (int*) calloc(10,sizeof(int)); ... free(punt); * punt = 10;

Page 17: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• altro errore comune ...

/* funzione che restituisce un puntatore ad un intero */int* una_funzione (){ int x; x=10; ... free( &x ); /* libera la memoria usata da x (?) */}

le variabili allocate staticamente (in maniera automatica)vengono anche disallocate automaticamente alla fine del blocco!

regola d’oro:free va usato solo con i puntatori restituiti da malloc / calloc

Page 18: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• altro errore comune : aliasing bug

... int *x, *y; /* alloco px */ x= (int*) malloc(sizeof(int)); /* assegno y = x. Ora x e y puntano allo stesso blocco di memoria */ y = x; /* uso x */ ... /* libero x */ free( x ); /* uso y */ *y = 10;

medicina: meglio usare un solo puntatore per ogni blocco di memoria allocato

Page 19: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Ripasso costrutti base:

Istruzioni di Controllo del Flusso

nozioni di sintassi e semantica(intuitivamente, non formalmente)

Page 20: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

if then else

• costrutto condizionale

if (<expression>) <statement1>else <statement2>

Come gia’ detto, esegue statement1 (il ramo then) sse l’espressione risulta diversa da zero

Page 21: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

<statement>

• Esempi di <statement>s:

y = x + 10;

{ y = x + 10; z = 4;};niente punto-e-virgola!

nota: punto e virgola...

Page 22: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

if then else

• costrutto condizionale

if (<expression>) <statement1>else <statement2>

if (x) y = x + 10; else y = 20;

if (x==2) {y = x + 10; ... } else y = 20;

Page 23: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

Lo sapevate che...

• In C, quasi tutti gli statement sono anche espressioni?

• Ad esempio, l’assegnamento

e’ anche un’espressione, che vale il valore assegnato (e ha anche il suo tipo)

• Cio’ consente di scrivere, per esempio:

(non solo e’ coinciso, ma e’ anche efficiente,come da filosofia C)

x = y

int x,y,z;x = y = z = 10 ;

Page 24: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

if then else: trappole

• errore di sintassi (non compila, innocuo)

• errore nella guardia (compila: errore “cattivo”. Cosa fa?)

• punto-e-virgola di troppo (compila: errore “cattivo”. Cosa fa?)

if (x=2) { y = x + 10; ... };

if (x==2) {y = x + 10; ... }; else y = 20;

if (x==2); { y = x + 10; ... };

Page 25: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

for

• costrutto iterativo

for (<expr0>;<expr1>;<expr2>) <stat>

for (i=0,j=10;(j>20) &&(i<5); i++, j--) { vect[i]+=10; printf(“%d”, vect[i]);}

Page 26: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

while

• ciclo while

while (<expr0>) <stat>

while (i<N && a[i]< 1000) i = i + 1;

Page 27: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

do while

• ciclo do-while

do <stat> while (<expr0>)

do{ printf("Immettere un valore intero pari\n"); scanf("%d",&a); /* leggi il numero a da tastiera */}while(a%2);

Page 28: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

switch

• costrutto condizionale a più vie

switch (<expr0>) { case <const1>: <stat1> break; ... case <const2>: <stat2> break;}

switch (ch){ case 'a': cont_a++; break; case 'e': cont_e++; break; case 'i': cont_i++; break; case 'o': cont_o++; break; case 'u': cont_u++; break; default : cont_car++; }

Page 29: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

switch

• senza break: fall trought

switch (oggi){ case LUN: ... /* gestisci il caso LUN */ break; case MAR: ... /* gestisci il caso MAR */ break; case SAB: ... /* operazioni solo per il SAB */ /* FALL TROUGHT */ case DOM: ... /* gestisci per il SAB e la DOM */ break; default : ... /* gestisci gli altri casi */}

Page 30: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

labels e goto

• salti non strutturati– di solito, simbolo di cattiva programmazione

• (programmi spaghetti)

– perlomeno, non eleganti

<label>:

goto <label>;

Page 31: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

labels e goto

• ad esempio:

• equivalente a:

i=0; while (i <= NUM) printf("%d \n",++i); ...

            i=0;    INIZIO : if (i>NUM) goto FINE;             printf("%d \n",++i);             goto INIZIO;    FINE :   ...

Page 32: Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.

M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 4 / 0 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

break e continue

• utilizzabili in tutti i cicli– for, while, do-while

• break = esci dal ciclo– (vai alla prima iterazione dopo il ciclo)

• continue = interrompi l’iterazone corrente

– vai all’inizio della prossima iterazione– (dove, per prima cosa, la guardia di uscita dal ciclo viene

testata)