Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Sia la bsearch che la qsort, così come tutti gli algoritmi di ordinamento e di ricerca, devono<br />
poter confrontare tra loro due valori dell’insieme. Nel caso della ricerca questo serve <strong>per</strong> decidere<br />
se l’elemento analizzato corrisponde a quello da trovare e, in caso contrario, <strong>per</strong> procedere opportunamente<br />
con la ricerca. Nel caso dell’ordinamento, bisogna stabilire la relazione d’ordine<br />
tra due elementi, ovvero stabilire se sono uguali oppure quale dei due è maggiore dell’altro. Dal<br />
momento che le funzioni presentate sono generiche, non esiste un unico modo <strong>per</strong> confrontare<br />
due elementi, poichè il confronto dipende dal significato dei bit che compongono gli elementi.<br />
Per esempio, il confronto tra due interi è banale e viene fatto dal compilatore, così come quello<br />
tra numeri a virgola mobile. Ma nel caso fosse necessario confrontare elementi più “complessi”,<br />
<strong>per</strong> esempio una struttura composta da vari campi dal significato particolare, deve allora essere<br />
il programmatore a fornire una opportuna funzione la quale, dati due elementi, ritorni un codice<br />
che indica la relazione d’ordine (l’uguaglianza <strong>per</strong> la ricerca è un caso particolare).<br />
L’ultimo parametro di entrambe le funzioni è quindi un puntatore a funzione, che punta ad<br />
una funzione definita dall’utente la quale confronta due elementi dell’insieme. Tale funzione è<br />
definita come segue<br />
typedef int (*__compar_fn_t) (void *, void *);<br />
essa accetta come parametri i puntatori agli elementi da confrontare, e ritorna<br />
• un valore minore di 0 se il primo parametro è minore del secondo;<br />
• 0 se sono uguali;<br />
• un valore maggiore di 0 se il primo parametro è maggiore del secondo.<br />
14.3.2 Controllo dell’esecuzione del programma<br />
Le funzioni più rilevanti <strong>per</strong> la gestione dell’esecuzione di un programma sono le seguenti:<br />
• void abort (void);<br />
termina immediatamente ed in modo anormale il programma, ed equivale <strong>alla</strong> ricezione del<br />
segnale di abort SIGABRT<br />
• int atexit (void (*func) (void));<br />
<strong>per</strong>mette di registrare una funzione la quale sarà eseguita appena prima della normale<br />
terminazione del programma; la funzione accetta il puntatore <strong>alla</strong> funzione da richiamare;<br />
• void exit (int status);<br />
causa la normale terminazione del programma, ritornando il valore status;<br />
• char *getenv (char *name);<br />
restituisce la stringa che nell’ambiente di lavoro del programma è associata al nome fornito<br />
name, oppure NULL se non esiste alcuna stringa;<br />
• int system (char *command);<br />
passa la stringa fornitale all’ambiente di lavoro <strong>per</strong> l’esecuzione del comando associato e<br />
restituisce il codice d’uscita del comando invocato.<br />
La funzione atexit può essere chiamata più volte, <strong>per</strong> registrare più di una funzione <strong>per</strong><br />
l’esecuzione al termine del programma. Le funzioni registrate sono eseguite in ordine inverso<br />
rispetto <strong>alla</strong> loro registrazione ed il controllo viene restituito all’ambiente chiamante. Il programma<br />
restituisce quindi un valore numerico, che generalmente indica lo stato del programma o la<br />
causa della sua terminazione, il quale deve essere fornito <strong>alla</strong> funzione stessa.<br />
141