18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

14.3.3 Gestione della memoria<br />

Le funzioni malloc e calloc allocano dinamicamente blocchi di memoria, la richiesta di nuova<br />

memoria viene fatta al sistema o<strong>per</strong>ativo che, se possibile, mette a disposizione del programma<br />

un nuovo blocco di memoria.<br />

Le funzioni inerenti l’allocazione e la gestione della memoria sono le seguenti:<br />

• void * malloc(size_t n);<br />

ritorna un puntatore ad un blocco di memoria di n byte<br />

• void * calloc(size_t n, size_t size);<br />

ritorna un puntatore ad un blocco di memoria in grado di contenere un vettore dinelementi<br />

di dimensione size il blocco di memoria viene inizializzato a 0<br />

• void * realloc(void *pt, size_t n);<br />

<strong>per</strong>mette di ridimensionare un blocco di memoria già allocato e puntato da pt, la nuova<br />

dimensione è n (il contenuto precedente viene mantenuto).<br />

• free (void *pt);<br />

libera il blocco di memoria di indirizzo pt precedentemente allocato tramite malloc o<br />

calloc.<br />

Tutte le funzioni di allocazione restituiscono NULL se non è stato possibile soddisfare la richiesta.<br />

14.3.4 Generazione di numeri casuali<br />

Tra le funzioni, ci sono quelle <strong>per</strong> la generazione di numero casuali (pseudo-casuali, in realtà)<br />

si effettua utilizzando le funzioni rand() e srand. Si parla di numeri pseudo-casuali in quanto<br />

la sequenza di numeri generata da rand “somiglia” ad una sequenza casuale di numeri, ma in<br />

realtà è generata da un opportuno algoritmo, che quindi è un processo deterministico, che tenta<br />

di “simulare” il più fedelmente possibile una sequenza casuale 3 .<br />

La funzionerand() ritorna un numero pseudo-casuale compreso nell’intervallo [0, RAND_MAX].<br />

E’ semplice ottenere un numero pseudo-casuale in un qualsiasi intervallo [a, b] utilizzando<br />

opportunamente l’o<strong>per</strong>atore modulo (vedi Sezione 6.19), come nell’esempio seguente:<br />

valore = a + rand() % (b - a + 1);<br />

Il generatore di numero pseudo-casuali può venire inizializzato impostando il valore del seme<br />

con la funzione srand. Il seme determina quale sarà la sequenza di numeri pseudo-casuali fornita<br />

dal generatore. L’impostazione del seme si rivela molto utile <strong>per</strong> ripetere in modo deterministico<br />

un programma che utilizza numeri casuali, <strong>per</strong> esempio <strong>per</strong> andare <strong>alla</strong> ricerca di comportamenti<br />

particolari che si verificano solo in seguito a determinate sequenze di numeri pseudo-casuali.<br />

Il programma in Figura 14.1 illustra il funzionamento del generatore di numeri pseudo-casuali<br />

<strong>per</strong> simulare il lancio di due dadi.<br />

Il programma legge da linea di comando il seme e il numero di lanci da effettuare, rispettivamente<br />

in questo ordine. Se i parametri non vengono forniti, sono usati i valori di default.<br />

3 Il problema di generare numeri casuali con un computer non è banale, e ha una estrema rilevanza in<br />

applicazioni come la crittografia, le simulazioni, ecc.<br />

142

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!