18.08.2013 Views

Fondamenti di Informatica - Linguaggio C Le funzioni - Robotica

Fondamenti di Informatica - Linguaggio C Le funzioni - Robotica

Fondamenti di Informatica - Linguaggio C Le funzioni - 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.

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

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

Saved successfully!

Ooh no, something went wrong!