Fondamenti di Informatica - Linguaggio C Le funzioni - Robotica
Fondamenti di Informatica - Linguaggio C Le funzioni - Robotica
Fondamenti di Informatica - Linguaggio C Le funzioni - Robotica
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
<strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C<br />
<strong>Le</strong> <strong>funzioni</strong><br />
Tullio Facchinetti<br />
<br />
31 marzo 2011<br />
12:13<br />
http://robot.unipv.it/toolleeo<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
<strong>Le</strong> <strong>funzioni</strong><br />
Definizione <strong>di</strong> funzione<br />
un funzione è una porzione <strong>di</strong> co<strong>di</strong>ce, detto<br />
anche sottoprogramma o, in inglese, subroutine,<br />
che può essere richiamata più volte in un<br />
programma<br />
le <strong>funzioni</strong> possono<br />
essere scritte dal programmatore ed utilizzate in un<br />
programma<br />
essere reperite in librerie <strong>di</strong> co<strong>di</strong>ce <strong>di</strong> utilità generale,<br />
ovvero collezioni <strong>di</strong> <strong>funzioni</strong> implementate a <strong>di</strong>sposizione<br />
per la soluzione <strong>di</strong> problemi comuni<br />
le <strong>funzioni</strong> <strong>di</strong> libreria sono solitamente ottimizzate, cioè<br />
realizzate nel miglior modo possibile: è quin<strong>di</strong> bene utilizzare<br />
delle <strong>funzioni</strong> <strong>di</strong> libreria quando <strong>di</strong>sponibili invece che<br />
duplicarne l’implementazione<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
<strong>Le</strong> <strong>funzioni</strong><br />
Caratteristiche generali<br />
ogni funzione ritorna un solo valore, <strong>di</strong> un tipo semplice o<br />
una struttura dati, oppure void, cioè nulla, e riceve zero o<br />
più argomenti<br />
in un programma ci possono essere <strong>di</strong>chiarazioni <strong>di</strong><br />
funzione e definizioni <strong>di</strong> funzione<br />
almeno una funzione è sempre presente: main<br />
ogni nome <strong>di</strong> funzione può essere presente una volta sola in<br />
un programma e ogni chiamata deve passare sempre lo<br />
stesso numero e tipo <strong>di</strong> argomenti<br />
alle <strong>funzioni</strong> varia<strong>di</strong>che possono essere passati un numero<br />
arbitrario argomenti ulteriori, anche 0<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Dichiarazione e definizione <strong>di</strong> <strong>funzioni</strong><br />
Panoramica<br />
la <strong>di</strong>chiarazione, o prototyping, serve a <strong>di</strong>chiarare<br />
l’interfaccia della funzione: nome della funzione, tipo<br />
restituito, elenco dei parametri;<br />
la definizione comprende la <strong>di</strong>chiarazione e la specificazione<br />
delle istruzioni che costituiscono la funzione<br />
per un corretto funzionamento del programma la<br />
<strong>di</strong>chiarazione <strong>di</strong> una funzione deve sempre precedere<br />
l’invocazione della stessa, mentre la definizione può essere<br />
presente in un qualunque punto del sorgente<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Dichiarazione<br />
La <strong>di</strong>chiarazione <strong>di</strong> una funzione<br />
in una <strong>di</strong>chiarazione, o prototyping, si riconoscono:<br />
il tipo <strong>di</strong> dato restituito dalla funzione, oppure void se la<br />
funzione non restituisce alcun valore; se non viene<br />
specificato il valore <strong>di</strong> ritorno, si assume che la funzione<br />
ritorni int,<br />
il nome della funzione<br />
i tipi degli eventuali argomenti, void o niente se la funzione<br />
non usa parametri<br />
termina con ’;’<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Dichiarazione<br />
Esempio <strong>di</strong> <strong>di</strong>chiarazione<br />
void funzione1(int arg1, double arg2);<br />
<strong>di</strong>chiara la funzione funzione1 che non restituisce alcun<br />
valore e richiede due argomenti: un intero ed un reale in<br />
doppia precisione<br />
altro esempio:<br />
char funzione2(void);<br />
<strong>di</strong>chiara la funzione funzione2 che restituisce un carattere<br />
e non richiede alcun argomento<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Definizione<br />
Definizione <strong>di</strong> <strong>funzioni</strong><br />
una definizione <strong>di</strong> funzione è costituita da due parti:<br />
una <strong>di</strong>chiarazione, in cui sono elencati:<br />
il tipo <strong>di</strong> dato restituito dalla funzione<br />
il nome della funzione<br />
gli eventuali argomenti<br />
il corpo della funzione, racchiuso tra parentesi graffe e<br />
comprendente queste parti opzionali:<br />
<strong>di</strong>chiarazioni e definizioni<br />
istruzioni<br />
una o più istruzioni return<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Definizione<br />
Definizione <strong>di</strong> una funzione senza co<strong>di</strong>ce<br />
è possibile definire una funzione come la seguente:<br />
do_nothing(){ }<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Definizione<br />
Dichiarazione e file <strong>di</strong> intestazione<br />
#include <br />
#include <br />
#include <br />
l’inclusione dei file <strong>di</strong> intestazione serve per includere la<br />
<strong>di</strong>chiarazione delle <strong>funzioni</strong><br />
un file <strong>di</strong> intestazione contiene soltanto la <strong>di</strong>chiarazione<br />
delle <strong>funzioni</strong>, tipicamente non la definizione<br />
il corpo delle <strong>funzioni</strong> è definito altrove<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio dei parametri<br />
Cosa sono i parametri<br />
una funzione può utilizzare parametri per<br />
svolgere il proprio lavoro<br />
sono variabili che vengono passate alla funzione al<br />
momento della sua invocazione<br />
contengono valori necessari a controllare le operazioni<br />
svolte dalla funzione<br />
oppure sono valori utilizzati nei calcoli svolti dalla funzione<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per valore<br />
Modalità del passaggio per valore<br />
la comunicazione fra il co<strong>di</strong>ce chiamante ed il sottoprogramma<br />
avviene sempre secondo la modalità del passaggio per valore<br />
la funzione utilizza una copia locale della variabile passata<br />
come parametro all’atto della chiamata<br />
tale variabile locale è inizializzata con il valore<br />
dell’espressione o della variabile impostata nel punto <strong>di</strong><br />
chiamata alla funzione<br />
la funzione potrà mo<strong>di</strong>ficare il valore della variabile locale,<br />
ma non quello dell’eventuale variabile passata come<br />
parametro all’invocazione della funzione stessa<br />
questo poichè le due variabili sono allocate in aree <strong>di</strong><br />
memoria <strong>di</strong>stinte.<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per valore<br />
File <strong>di</strong> esempio<br />
func decl.c<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per valore<br />
Passaggio dei parametri<br />
le variabili a, b della funzione massimo non<br />
hanno alcun legame con le variabili a e b<br />
<strong>di</strong>chiarate all’interno della funzione main<br />
un’invocazione altrettanto lecita è<br />
massimo(b, a);<br />
si noti che nel main sono definite come int<br />
mentre nella funzione come double: il<br />
compilatore effettua automaticamente le<br />
conversioni <strong>di</strong> tipo necessarie<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Modalità del passaggio per riferimento<br />
in molte situazioni è necessario permettere alla funzione<br />
chiamata <strong>di</strong> poter mo<strong>di</strong>ficare il valore della variabile passata dal<br />
chiamante all’atto dell’invocazione della funzione<br />
la tecnica per il passaggio dei parametri che permette<br />
questa operazione è detta passaggio per riferimento<br />
il passaggio per riferimento implica il passaggio del<br />
puntatore alla variabile<br />
in questo modo alla funzione chiamata è nota la locazione<br />
<strong>di</strong> memoria alla quale la variabile <strong>di</strong> interesse è allocata<br />
è quin<strong>di</strong> possibile mo<strong>di</strong>ficare il valore della variabile<br />
originale scrivendo <strong>di</strong>rettamente in tale locazione <strong>di</strong><br />
memoria<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
File <strong>di</strong> esempio<br />
swap.c<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Esempio <strong>di</strong> passaggio per riferimento: swap <strong>di</strong> variabili<br />
per esempio, una funzionalità spesso utile è quella dello<br />
scambio del valore <strong>di</strong> due variabili<br />
questo può essere fatto implementando una funzione<br />
apposita che, come nell’esempio seguente, scambia il valore<br />
<strong>di</strong> due interi passati per riferimento:<br />
void swap(int *a, int *b)<br />
{<br />
int tmp;<br />
}<br />
tmp = *a;<br />
*a = *b;<br />
*b = tmp;<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Passaggio per riferimento: passaggio <strong>di</strong> strutture<br />
gli argomenti delle <strong>funzioni</strong> possono essere tipi semplici o<br />
strutture dati<br />
sono sempre passati per valore<br />
anche se è consentito, normalmente non vengono passate<br />
strutture dati né come argomenti né come valori <strong>di</strong> ritorno<br />
si preferisce invece, per ragioni <strong>di</strong> efficienza, allocare le<br />
strutture dati separatamente e passare solo i puntatori ad<br />
esse, effettuando così un passaggio per riferimento<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Passaggio <strong>di</strong> strutture<br />
perchè si parla <strong>di</strong> questioni <strong>di</strong> efficienza?<br />
il passaggio per valore comporta l’allocazione <strong>di</strong> una copia<br />
locale delle variabili <strong>di</strong>chiarate nella lista dei parametri<br />
tali variabili devono anche essere inizializzate per riflettere<br />
il valore delle variabili o espressioni del chiamante<br />
nel caso in cui il parametro passato sia una variabile, la<br />
copia esplicita <strong>di</strong> una porzione <strong>di</strong> memoria dalla variabile<br />
utilizzata per la chiamata alla variabile locale<br />
nel caso le variabili siano strutture dati c’è quin<strong>di</strong> una<br />
per<strong>di</strong>ta <strong>di</strong> efficienza nel passaggio dei parametri che è<br />
proporzionale alla <strong>di</strong>mensione della variabile<br />
il tempo necessario alla copia del valore aumenta<br />
all’aumentare della <strong>di</strong>mensione della struttura<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Ritornare più valori<br />
un altro caso in cui è utilizzato il passaggio per<br />
riferimento è nel caso in cui una funzione debba<br />
ritornare più <strong>di</strong> un valore<br />
anche in questo caso è possibile utilizzare il passaggio per<br />
riferimento<br />
si passano quin<strong>di</strong> dei puntatori come argomenti ulteriori, in<br />
modo che la funzione possa scrivere i valori <strong>di</strong> ritorno in<br />
una o più variabili del chiamante<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Esempio <strong>di</strong> funzione che ritorna più valori<br />
int get_coord(int *x, int *y)<br />
{<br />
int skip = 1;<br />
int xtemp, ytemp;<br />
}<br />
/* calcoli e istruzioni necessarie all’assegnamento <strong>di</strong><br />
xtemp, ytemp e skip */<br />
if (!skip) {<br />
*x = xtemp;<br />
*y = ytemp;<br />
}<br />
return skip;<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Passaggio <strong>di</strong> vettori<br />
il passaggio <strong>di</strong> un vettore come parametro avviene con il<br />
passaggio <strong>di</strong> un puntatore (il nome del vettore)<br />
#define SIZE (50)<br />
/* ... */<br />
int func(int *v, int n);<br />
/* ... */<br />
int vettore[SIZE];<br />
/* ... */<br />
func(vettore, SIZE);<br />
tipicamente è necessario passare il numero <strong>di</strong><br />
elementi, poiché la funzione non ha modo <strong>di</strong><br />
conoscere la <strong>di</strong>mensione del vettore<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Passaggio per riferimento<br />
Passaggio <strong>di</strong> stringhe<br />
anche per le stringhe, in quanto vettori <strong>di</strong> char, viene passato il<br />
puntatore<br />
int func(char *st);<br />
/* ... */<br />
int stringa[50];<br />
/* ... */<br />
func(stringa);<br />
non è in<strong>di</strong>spensabile la <strong>di</strong>mensione, poiché il numero <strong>di</strong><br />
caratteri significativi è terminato da ’\0’<br />
se però si tratta <strong>di</strong> un vettore <strong>di</strong> char che non contiene una<br />
stringa, allora la <strong>di</strong>mensione è necessaria<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
La funzione main<br />
Cos’è la funzione main<br />
un programma C deve sempre includere una<br />
funzione chiamata main<br />
la funzione main, o “il main”, è il punto dal quale il<br />
programma inizia la sua esecuzione<br />
la funzione main può essere definita in due mo<strong>di</strong><br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
La funzione main<br />
Definizione del main<br />
il primo modo <strong>di</strong> definire la funzione main prevede <strong>di</strong> specificare<br />
il tipo restituito, che deve essere sempre intero, e nessun<br />
parametro<br />
esempio:<br />
int main(void)<br />
in taluni contesti è possibile trovare definizioni del tipo<br />
void main(void)<br />
tale definizione viene accettata dal compilatore, con la<br />
generazione <strong>di</strong> un warning, ma dovrebbe essere evitata e in<br />
queste <strong>di</strong>spense sarà considerata una definizione errata<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
I parametri della funzione main<br />
Argomenti del programma<br />
la seconda possibilità è quella <strong>di</strong> dotare il main <strong>di</strong> due<br />
parametri, come nell’esempio seguente<br />
int main(int argc, char **argv)<br />
oppure<br />
int main(int argc, char *argv[]);<br />
i parametri verranno inizializzati all’atto della<br />
chiamata della funzione main, ovvero dell’avvio del<br />
programma, con i valori recuperati dalla linea <strong>di</strong><br />
comando utilizzata per invocare il programma stesso<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
I parametri della funzione main<br />
Argomenti del programma: argc e argv<br />
i parametri sono chiamati convenzionalmente argc e<br />
argv definiti rispettivamente come int e char **<br />
la prima variabile memorizza il numero <strong>di</strong> argomenti sulla<br />
riga <strong>di</strong> comando<br />
la seconda memorizza l’in<strong>di</strong>rizzo del primo elemento <strong>di</strong> un<br />
vettore <strong>di</strong> puntatori a carattere<br />
ogni puntatore fa riferimento al primo carattere <strong>di</strong> ciascun<br />
argomento<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Puntatori a funzione<br />
Puntatori a funzione<br />
come nel caso dei vettori, una funzione viene rappresentata<br />
dall’in<strong>di</strong>rizzo del co<strong>di</strong>ce associato<br />
tutte le volte che si usa un nome <strong>di</strong> funzione in un<br />
programma si sta in pratica usando il puntatore a tale<br />
funzione<br />
l’uso più consueto <strong>di</strong> un puntatore a funzione è<br />
l’applicazione dell’operatore parentesi-tonde<br />
questa situazione normalmente non viene pensata in<br />
termini <strong>di</strong> puntatori ed operatori da parte del<br />
programmatore<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Puntatori a funzione<br />
Puntatori a funzione<br />
un puntatore a funzione può essere assegnato ad altri<br />
puntatori<br />
per esempio all’interno <strong>di</strong> strutture dati che definiscono i<br />
meto<strong>di</strong> con cui operare sugli oggetti, oppure passato come<br />
argomento a altre <strong>funzioni</strong><br />
il compilatore verifica in compilazione che i tipi dei<br />
puntatori a funzione siano compatibili, cioè le <strong>funzioni</strong><br />
come <strong>di</strong>chiarate ricevano gli stessi argomenti<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Puntatori a funzione<br />
File <strong>di</strong> esempio<br />
sort search.c<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Puntatori a funzione<br />
Esempio e uso <strong>di</strong> puntatori a funzione<br />
per esempio la funzione <strong>di</strong> libreria qsort, funzione che<br />
implementa l’algoritmo “quick sort” su un vettore<br />
#include /* per la <strong>di</strong>chiarazione <strong>di</strong> strcmp */<br />
#include /* per la <strong>di</strong>chiarazione <strong>di</strong> qsort */<br />
/* definisco un vettore <strong>di</strong> 100 puntatori */<br />
char *strings[100];<br />
/* confronto due stringhe */<br />
strcmp(strings[0], strings[1]);<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Puntatori a funzione<br />
Esempio e uso <strong>di</strong> puntatori a funzione<br />
/* chiamo qsort <strong>di</strong>cendo che strcmp()<br />
\‘e la funzione <strong>di</strong> confronto da usare */<br />
qsort(strings, 100, sizeof(char *), strcmp);<br />
/* confronto solo i primi 5 caratteri */<br />
strncmp(strings[0], strings[1], 5);<br />
/* questo invece \‘e un errore,<br />
perché strncmp riceve tre argomenti */<br />
qsort(strings, 100, sizeof(char *), strncmp);<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Numero variabile <strong>di</strong> parametri<br />
<strong>Le</strong> <strong>funzioni</strong> varia<strong>di</strong>che<br />
si possono definire <strong>funzioni</strong> con numero variabile <strong>di</strong><br />
argomenti (varia<strong>di</strong>che)<br />
l’esempio più comune <strong>di</strong> funzione varia<strong>di</strong>ca è printf con<br />
tutte le sue varianti<br />
definire la propria funzione varia<strong>di</strong>ca richiede una certa<br />
attenzione e conoscenza del meccanismo <strong>di</strong> passaggio dei<br />
parametri<br />
non verrà trattato in questa sede<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f
Introduzione Dichiarazione e definizione I parametri Funzione main Car. avanzate<br />
Numero variabile <strong>di</strong> parametri<br />
Caratteristiche delle <strong>funzioni</strong> varia<strong>di</strong>che<br />
chiamare una funzione varia<strong>di</strong>ca è invece molto frequente<br />
basta specificare correttamente tutti gli argomenti<br />
nel caso dei derivati <strong>di</strong> printf, uno dei primi argomenti è<br />
una stringa che specifica il numero e il tipo degli argomenti<br />
successivi<br />
la funzione varia<strong>di</strong>ca usa la stringa per sapere cosa sono gli<br />
argomenti ulteriori<br />
data la standar<strong>di</strong>zzazione del formato della stringa, il<br />
compilatore può controllare tutti gli argomenti passati e<br />
avvertire del possibile errore in caso <strong>di</strong> incongruenze<br />
per <strong>funzioni</strong> varia<strong>di</strong>che non assimilabili a printf il<br />
controllo del compilatore non è previsto<br />
Tullio Facchinetti <strong>Fondamenti</strong> <strong>di</strong> <strong>Informatica</strong> - <strong>Linguaggio</strong> C <strong>Le</strong> f