La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Process synchronization

Presentazioni simili


Presentazione sul tema: "Process synchronization"— Transcript della presentazione:

1 Process synchronization
Operating System Puntatori Marco D. Santambrogio – Ver. aggiornata al 20 Aprile 2016 © 2005 William Fornaciari

2 Come rappresento un pixel?
Il pixel è Il colore Come ottengo il verde? Con il formato RGB R: 91 G: 191 B: 33 PIXEL = {R, G, B}

3 Tipi di dati strutturati: pixel
struct pixel{ char G; char R; char B; };

4 Tipi di dati strutturati: pixel
struct pixel{ char G; char R; char B; }; struct pixel{ unsigned int G; unsigned int R; unsigned int B; }; THINK BIG!!!

5 Tipi di dati strutturati
struct miastruttura { char campo1; float campo2; int campo3[2]; }; ? miastruttura campo1 campo2 campo3

6 Definire un nuovo tipo Tipi strutturati: typedef struct { char campo1; float campo2; int campo3[2]; } Record; Record ilMioRecord; 24.56 23 A ilMioRecord 45 ? ilMioRecord campo1 campo2 campo3 ilMioRecord.campo1 = 'A'; ilMioRecord.campo2 = 24.56; ilMioRecord.campo3[0] = 23; ilMioRecord.campo3[1] = 45;

7 I numeri complessi Il dato “numero complesso” è caratterizzato da una struttura a due campi Parte reale Parte complessa

8 I numeri complessi Il dato “numero complesso” è caratterizzato da una struttura a due campi Parte reale Parte complessa

9 I numeri complessi Il dato “numero complesso” è caratterizzato da una struttura a due campi Parte reale Parte complessa Il tipo di dato complesso, si basa su questa struttura

10 I numeri complessi Mettendo tutto insieme

11 I numeri complessi Mettendo tutto insieme

12 Immagini Struttura dati: typedef struct{ int R; int G; int B; } pixel
pixel img[30][24]; Ma quanto è grossa immagine? pixel=(int*3) img= pixel*30*24 1 immagine= 2160 interi

13 Manipoliamo immagine Problema: mettiamo a 0, tutti i pixel con rosso minore di 50 (soglia) Se volessimo scrivere una funzione che risolve il problema dato? Cosa ritorna? NB: una immagine è un insieme di pixel, non un solo dato! Quali sono i parametri di ingresso? void TagliaRossi(pixel immagine[30][24], int soglia);

14 RICORDIAMO: passaggio per valore
Ambiente della funzione somma d1, d2 risultato Quando la funzione termina il valore di risultato in somma viene copiato il risultato nel main Quando invoco la funzione in d1 e d2 vengono copiati i valori di valore1 e valore 2 } /* nel main */ float valore1, valore2; float risultato; risultato=somma(valore1,valore2); valore1, valore2 risultato Ambiente della funzione main

15 Quindi…. void TagliaRossi(pixel immagine[30][24], int soglia); Perchè?
/* nel main */ pixel img[30][24]; int val_soglia; TagliaRossi(img[30][24], val_soglia); Ambiente della funzione TagliaRossi immagine[30][24] soglia Quando invoco la funzione in immagine[30][24] vengono copiati i valori di img[30][24] Perchè? Spreco di memoria: 2160 interi *2 array1=array2 : VIETATO in C img[30][24] val_soglia Ambiente della funzione main

16 Cosa ci piacerebbe? Avere una sola copia del dato
Non vogliamo sprecare spazio Poter accedere a quella copia in maniera sicura Non vogliamo usare variabili globali! Sarebbe troppo alto il rischio di commettere errori! Invece che per copia, ci piacerebbe accedere tramite indirizzo

17 E quindi (veramente)… Sapendo dove si trova il primo punto
pixel img[30][24]; aka: indirizzo primo pixel img[0][0] Con le dimensione della matrice: Righe: 30 Colonne: 24 Possiamo arrivare ad ogni punto (r,c)!!! Indirizzo di img[0][0] + r*Colonne + c &img[0][0] + r*Colonne + c

18 Obiettivi Puntatori

19 Obiettivi Puntatori Li conoscete già!!!

20 Obiettivi Puntatori int main(){ int dato; scanf(“%d”,&dato); }

21 Variabili e indirizzi int var; &var var
3 int var; 2 &var var 1 Supponiamo che la dichiarazione riservi la zona di memoria all’indirizzo 1 var indica il contenuto della cella di memoria &var indica l’indirizzo della cella di memoria

22 Puntatori – premessa Dichiarare una variabile significa riservare una zona di memoria composta da diverse celle Il numero di celle dipende dal tipo di dato Ogni cella di memoria ha un indirizzo fisico e: il nome della variabile indica il contenuto della cella di memoria l’operatore & permette di ottenere l’indirizzo di memoria della cella associata alla variabile cui l’operatore è applicato

23 Puntatore È un tipo di dato che ammette tra i suoi valori un indirizzo di memoria La zona di memoria viene detta “puntata” dalla variabile puntatore La variabile puntatore viene detto che “punta” ad una cella di memoria Quando dichiaro un puntatore si deve anche specificare che tipo di dato viene ospitato nella cella puntata Sintassi: int *p;

24 Significato int *p; &p p p è una variabile come tutte le altre quindi
3 int *p; 2 &p p 1 p è una variabile come tutte le altre quindi p indica il contenuto della cella di memoria &p indica l’indirizzo di memoria Quello che caratterizza una variabile di tipo puntatore è il fatto che il suo valore è esso stesso un indirizzo di memoria

25 Deferenziazione Ad una variabile di tipo puntatore posso applicare l’operatore di deferenziazione * *p indica il contenuto della cella puntata da p Se p è un puntatore ad un intero allora *p è una semplice variabile intera int *p; *p=5; /* OK. *p è un intero */ p=5; /* errore. p è un puntatore */ Attenzione! Il simbolo * lo uso sia nella dichiarazione che nella deferenziazione

26 Operazioni A una variabile di tipo puntatore posso assegnare un indirizzo di memoria int x; int *p; x=5; p=&x; /* *p vale 5 */ p punterà alla zona di memoria in cui è memorizzato il valore di x Ad una variabile puntatore non viene mai assegnato una costante 3 1 &p p 2 &x 1 5 x

27 Pointer Fun with Binky This is document 104 in the Stanford CS Education Library. Please see for this and other free educational materials. Copyright Nick Parlante 1999.

28 Passaggio per INDIRIZZO
All’atto della chiamata l’indirizzo dei parametri attuali viene associato ai parametri formali il parametro attuale e il parametro formale si riferiscono alla stessa cella di memoria Il sottoprogramma in esecuzione lavora nel suo ambiente sui parametri formali (e di conseguenza anche sui parametri attuali) ogni modifica sul parametro formale è una modifica del corrispondente parametro attuale Gli effetti del sottoprogramma si manifestano nel chiamante con modifiche al suo ambiente locale di esecuzione

29 Esempio: passaggio per indirizzo
float circonferenza(float *raggio) { float circ; circ = *raggio * 3.14; *raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; } /* nel main */ float c,r=5; c=circonferenza(&r); /*attenzione! D’ora in poi r vale 7 */ Ambiente della funzione circonferenza raggio circ Quando invoco la funzione in raggio viene copiato l’indirizzo di r. Quindi *raggio e r sono la stessa cosa Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main r c Ambiente della funzione main

30 Esempio: scambio valori
Si scriva una funzione in C che, dati due valori interi, gli restituisce scambiati

31 Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) p a 3 3 b q 7 7 temp

32 Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) p a 3 3 b q 7 7 temp 3

33 Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) p a 3 7 b q 7 7 temp 3

34 Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) p a 3 7 b q 7 3 temp 3

35 Esempio: scambio di 2 valori interi
void swap (int p, int q) { int temp; temp = p; p = q; q = temp; } Nel main: swap(a,b) p a 3 7 b q 7 3 temp Al termine dell’esecuzione di swap le variabili nel main restano inalterate! 3

36 Esempio: scambio di 2 valori interi
void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) p a 3 b q 7 temp

37 Esempio: scambio di 2 valori interi
void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) p a 3 b q 7 temp 3

38 Esempio: scambio di 2 valori interi
void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) p a 7 b q 7 temp 3

39 Esempio: scambio di 2 valori interi
void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) p a 7 b q 3 temp 3

40 Esempio: scambio di 2 valori interi
void swap (int *p, int *q){ int temp; temp = *p; *p = *q; *q = temp; } Nel main: swap(&a, &b) p a 7 b q 3 temp Al termine dell’esecuzione di swap le variabili nel main vengono modificate 3

41 Particolarità delle stringhe
Il nome dell’array rappresenta l’indirizzo del suo primo elemento, perciò quando ci si vuole riferire all’intero array nella scanf non si mette il simbolo &! scanf("%s", stringa); Questa scanf legge in input i caratteri fino a quando trova il carattere “blank” (lo spazio), o l’invio NOTA: se nel buffer si trova una stringa “troppo lunga”, essa è memorizzata oltre la fine dell’array !!! Ed è un errore grave !!! Attenzione! Gli array (TUTTI) sono sempre passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore

42 Problema: copia stringhe
Si scriva un programma in C che, data una stringa, la copia in una seconda stringa

43 Copia stringhe: dati e inserimento

44 Copia stringhe: dati e inserimento

45 Copia stringhe: dati e inserimento
Attenzione! Gli array (TUTTI) sono sempre passati per indirizzo. Una variabile di tipo array, infatti, è per definizione un puntatore

46 Copia stringhe: dati e inserimento
#define DIM 5 […] char stringa1[DIM];

47 Copia stringhe: lunghezza

48 Copia stringhe: lunghezza

49 Copia stringhe: lunghezza v2

50 Copia stringhe: copia elementi

51 Copia stringhe: copia elementi

52 Copia stringhe: tutto insieme

53 E se usassimo le librerie?

54 Problema: copia stringhe

55 Ecco perché string.h!!!

56 Problema: copia stringhe

57 Operazioni su stringhe
char str1[32]; / str1 ha spazio per 32 char. / char str2[64]; / str2 ha spazio per 64 char. / / inizializza str1 con la stringa "alfa" / strcpy(str1, "alfa"); / str1 contiene "alfa" / / copia str1 in str2 / strcpy(str2, str1); / str2 contiene "alfa" / / lunghezza di str1 / x = strlen(str1); / x assume valore / / scrivi str1 su standard output / printf("%s", str1); / scrive str1 su stdout / / leggi str1 da standard input / scanf("%s", str1); / str1 “riceve” da stdin /

58 Operazioni su stringhe
char str1[32]; char str2[64]; scanf("%s", str1); > ciao / ora str1 contiene "ciao" / strcpy(str2, str1);/ str2 riceve "ciao"/ val = strlen(str2); / val = / printf("%s\n", str2); > ciao / stampa "ciao" / Attenzione: strlen("") vale 0 !

59 Fonti per lo studio + Credits
Binky Pointer Fun Video: Credits Gianluca Palermo


Scaricare ppt "Process synchronization"

Presentazioni simili


Annunci Google