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

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

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

Saved successfully!

Ooh no, something went wrong!