Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoPietro Bertoni Modificato 11 anni fa
1
Laboratorio di Linguaggi lezione IV: tipi definiti dallutente Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08
2
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Tipi definiti: il tipo enum. ("giorno" è una var che vale uno dei valori listati) enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } giorno; esempio: meglio definire un tipo: typedef enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } GiornoSettimana; GiornoSettimana ieri, oggi; ("GiornoSettimana" è il tipo delle variabili che possono assumere i valori listati, e "ieri" e "oggi" sono due variabili di tale tipo)
3
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Tipi definiti: il tipo enum. typedef enum { LUN, MAR, MERC, GIOV, VEN, SAB, DOM } GiornoSettimana; GiornoSettimana ieri, oggi; semplicemente delle nuove costanti, che valgono 0, 1, 2, 3, 4, 5, 6 if ( (oggi > MERC) && (oggi <= VEN ) )... if ( oggi == DOM ) oggi = LUN; else oggi++; oggi = ( oggi + 5 ) % 7; come si fanno passare 5 giorni? sono implementati come interi, a tutti gli effetti.
4
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Tipi composti: il tipo struct typedef struct { char giorno; Mese mese; short anno; } Data; Data oggi, mio_compleanno; Data data_esame = { 28, OTTOBRE, 2004 }; int main(){ data_esame.mese = DICEMBRE ;... } definizione del tipo. MA NON E' UNA CLASSE: tutto "public" niente metodi niente costruttore… dichiarazione di alcune variabili con inizializzatore (nota la sintassi del literal, a dx del '=') accesso ai campi (come per le classi) Il nuovo tipo Nota: un literal di tipo Data Il nome scelto per il nuovo tipo
5
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Il tipo struct: in memoria typedef struct { char giorno; Mese mese; short anno; } Data; codifica di giornocodifica di mesecodifica di anno in memoria, una struct e' codificata come la semplice concatenzaione delle codifiche dei suoi campi : codifica della Data offset del campo anno
6
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Il tipo struct: in memoria typedef struct { char giorno; Mese mese; short anno; } Data; codifica di giornocodifica di mesecodifica di anno in memoria, una struct e' codificata come la semplice concatenzaione delle codifiche dei suoi campi : codifica della Data a indirizzo di a.anno = (indirizzo base di a) + (offsett campo anno) a.anno
7
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Il tipo struct: dimensione typedef struct { char giorno; Mese mese; short anno; } Data; sizeof(Data) si può chiedere la dimensione del nuovo tipo "Data": sizeof(char)+sizeof(Mese)+sizeof(short) che di solito sarà uguale a: Ma ci possono essere problemi di allineamento (es, dimensioni che devono essere multipli di 4)... usare sizeof!
8
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Il tipo struct: strutture innestate (nested) typedef struct { char giorno; Mese mese; short anno; } Data; typedef struct { Data partenza; Data arrivo; int numero_stanza; } Prenotazione; Prenotazione p = { { 28, OTTOBRE, 2004 }, { 2, NOVEMBRE, 2004 }, 23 }; /* definizione var p, con inizializzazione */
9
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Il tipo struct: asseganmenti typedef struct { char giorno; Mese mese; short anno; } Data; typedef struct { Data partenza; Data arrivo; int numero_stanza; } Prenotazione; Prenotazione pren1, pren2;... pren1 = pren2; /* assegnamento fra struct: * copia diretta della memoria * (quindi di tutti i campi) */
10
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Gli array simile a java… come prima, si può definire il tipo senza dichiarare nessuna variabile... Esempio /* cartella della tombola, contiene 15 numeri*/ int cartella[15]; typedef int Cartella[15]; int main(){ Cartella mia, sua; mia[2]=31; } si usano solo tipi interi per indicizzare. (qui: da 0 a 14) NB: no range checking ! Segmentation faults sempre in agguato. deve essere una costante! (il comp. deve sapere quanti elementi allocare)
11
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Gli array: inizializzazione Inizializzazione di array (opzionale, come sempre) int cartella[15]={ 10,21,33,13,4, 12,4, 53, 1,78, 2,54,31,86,78, }; l'ultima virgola è tollerata int cartella[]={ 10,21,33,13,4, 12,4, 53, 1,78, 2,54,31,86,78, }; se si inizializza un array, allora non è necessario specificare il numero di elementi (li conta il compilatore per noi)
12
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Gli array: inizializzazione Inizializzazione di array: –gli array di caratteri godono di un inizializzatore speciale: –questa inizializzazione: –si può scrivere equivalentemente così: char nome[]={'m','a','r','c','o',' ','t','a','r','i','n','i',0}; char nome[]= "marco tarini"; ' 't' '\0' nome[ 5] nome[ 6] nome[12] vale la costante char 0. Si può scrivere anche così: Per convenzione, è usato come terminatore delle stringhe: '\0'
13
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Gli array: in memoria Importante: –in memoria, gli elementi di un array sono memorizzati in una serie di celle contigue –ogni cella ha la stessa grandezza –per questo gli array sono random access! int cartella[5]={ 10,21,33,13,4, }; 10 indirizzo base di "cartella" 2133134 indirizzo di cartella[3] = (indirizzo base) + 3 x (dimensione cella) cartella[3] dimensione cella (=4)
14
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Problema Cosa succede, se non si sa a priori quanti elementi dovremo allocare? –(a tempo di esecuzione) Necessità allocazione dinamica di array. Per la soluzione di questo (e molti altri) problema, useremo i puntatori
15
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a E' arrivato il momento de... I PUNTATORI
16
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Puntatori: intro Una tipo variabile che contiene un indirizzo di una locazione di memoria: –l'indirizzo di un'altra variabile!
17
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Puntatori: sintassi della dichiarazione int* pippo; " pippo " è una var di tipo int *, cioè puntatore ad intero int *pippo; " * pippo " (cioè il valore puntato da pippo) è una var di tipo intero o se preferite:
18
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Puntatori: sintassi dell'uso pippo il valore del puntatore. *pippo il valore dell'oggetto puntato. entrambi possono essere sia letti che assegnati (possono comparire da entrambi i lati di un assegnamento)
19
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Puntatori: preambolo Cosa succede normalmente… int pippo = 0xA0; R A M 0x00000000 0xFFFFFFFF il compilatore assegna alla variabile pippo una locazione di memoria. Ad esempio, la locazione 0x612A22C Inoltre, riserva quei quattro byte per la variabile pippo. spazio degli indirizzi logici 0x612A0230 0x612A022C 0x612A0228 0x612A0224 0x612A0220 0x612A021C 0x612A0218 0x612A0214 00 00 00 FF 01 22 00 AB 21 00 00 00 12 23 D2 FF FF 02 41 A4 21 2A 02 2C 00 00 00 A0 12 33 A3 D0
20
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 7 / 0 8 - U n i v e r s i t à d e l l I n s u b r i a Puntatori: preambolo Cosa succede normalmente… int pippo = 0xA0; pippo = 0x00AABB00; R A M 0x00000000 0xFFFFFFFF il compilatore assegna alla variabile pippo una locazione di memoria. Ad esempio, la locazione 0x612A22C Inoltre, riserva quei quattro byte per la variabile pippo. spazio degli indirizzi logici 0x612A0230 0x612A022C 0x612A0228 0x612A0224 0x612A0220 0x612A021C 0x612A0218 0x612A0214 00 00 00 FF 01 22 00 AB 21 00 00 00 12 23 D2 FF FF 02 41 A4 21 2A 02 2C 00 00 00 A0 12 33 A3 D0 Inoltre variabiletipolocazione pippoint 0x612A22C dopo la complazione STORE 0x0612A22C 0x00AABB00 00 AA BB 00
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.