Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
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