Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili"

Transcript

1 Indirizzo di una funzione 2 Puntatori a funzioni Ver. 2.4 Si può chiamare una funzione utilizzando l indirizzo di memoria dal quale inizia il codice eseguibile della funzione stessa L indirizzo di memoria di una funzione può essere assegnato ad una variabile puntatore, memorizzato in un vettore, passato a una funzione, restituito da una funzione Claudio Fornaro - Corso di programmazione in C Definizione di variabili 3 Definizione di variabili 4 tipo (*nome)(parametri); definisce la variabile nome come puntatore a una funzione che restituisce un valore del tipo indicato e richiede i parametri indicati Le parentesi intorno al nome sono necessarie altrimenti si ha: tipo *nome(parametri); e questa costituisce il prototipo di una funzione che restituisce un puntatore del tipo indicato e richiede i parametri indicati double (*fp)(); definisce fp come variabile puntatore a una funzione che restituisce un double, nulla è indicato per i suoi parametri, quindi non vengono controllati (un compilatore C++ invece considera l argomento come void) double (*fp)(double, double); definisce fp come variabile puntatore a una funzione che ha come parametri due double e restituisce un double

2 Definizione di variabili int (*fpv[3])(long); definisce fpv come vettore di 3 elementi, ciascuno è un puntatore a una funzione che ha come parametri un long e restituisce un int Le definizioni esterne inizializzano a NULL le variabili puntatori a funzioni 5 Inizializzazione Il nome di una funzione equivale al suo indirizzo di memoria (come per i vettori) Con le seguenti funzioni (prototipi): double pow(double,double); double atan2(double,double); int f1(long), f2(long); si possono avere le seguenti inizializzazioni: double (*fp)(double,double) = NULL; double (*fp)(double,double) = pow; int (*fpv[3])(long)=f1,f2; /*+1NULL*/ int (*fpv[3])(long)=null;/*3 NULL*/ 6 Utilizzo con typedef typedef può definire un tipo puntatore a funzione con determinati parametri e valore restituito typedef double (*fptype)(double,double); dichiara fptype come tipo puntatore a funzione con due argomenti double e che restituisce un double fptype fp = pow; fptype fpv[5] = pow,null,atan2; Nota: fpv[3] e fpv[4] sono inizializzati a NULL perché l inizializzazione dei primi elementi impone 0 (NULL) per i rimanenti 7 Assegnazione Il nome di una funzione equivale al suo indirizzo di memoria (come per i vettori) L operatore & è ininfluente se applicato al nome di una funzione Esempi (l operatore & può essere omesso): fp = &atan2; fp = atan2; fpv[2] = &f1; fpv[2] = f1; 8

3 Confronto È un normale confronto tra puntatori, permette ad esempio di determinare se il puntatore si riferisce ad una certa funzione o no oppure se è NULL if (fp == pow) printf("fp punta a pow\n"); 9 Chiamata della funzione La funzione il cui puntatore è stato memorizzato nella variabile fp può essere richiamata in due modi equivalenti: (*fp)(argomenti) fp(argomenti) Il primo metodo rende più evidente che si tratta di un puntatore a funzione e non del nome di una funzione, il secondo è più leggibile e comodo x = (*fp)(2.23, 4.76); x = fp(2.23, 4.76); i = (*fpv[1])(22); i = fpv[1](22); 10 Passaggio a funzione 11 Passaggio a funzione 12 Un puntatore a funzione può essere passato ad una funzione come argomento Questo permette di passare ad una funzione [puntatori a] funzioni diverse per ottenere dalla stessa funzione comportamenti diversi Il parametro attuale deve essere il nome di una funzione Il parametro formale deve essere il prototipo delle funzioni chiamabili (è lì che viene definito il nome del puntatore visto dall interno della funzione stessa) Esempio Si supponga di avere le due funzioni seguenti: int piu(int a,int b) fa la somma di 2 numeri interi int meno(int a,int b) fa la differenza di 2 numeri interi m = calc(12, 23, piu); calcola somma dei due valori n = calc(12, 23, meno); calcola la differenza dei due valori

4 Passaggio a funzione int piu(int a,int b) return a+b; int meno(int a,int b) return a-b; int calc(int x,int y,int (*funz)(int,int)) return (*funz)(x,y); e usato qui int m, n; m = calc(12, 23, piu); n = calc(12, 23, meno); il nome funz viene dichiarato qui Valore restituito da funzione Una funzione può restituire un puntatore a funzione (2 metodi) Primo metodo Si definisce con l istruzione typedef il tipo del puntatore-a-funzione restituito dalla funzione chiamata: typedef int (*TipoFunz)(int,int); TipoFunz è un nuovo tipo: puntatore-afunzione-che-ha-2-argomenti-int-erestituisce-un-int E lo si usa nel solito modo: TipoFunz operaz(int x); 14 Valore restituito da funzione typedef int (*TipoFunz)(int,int); int piu(int a,int b) return a+b; int meno(int a,int b) return a-b; TipoFunz operaz(int f) static TipoFunz fpv[2]=piu,meno; return fpv[f]; int y; static per poter usare il puntatore dopo che la funzione è terminata TipoFunz op; /* var. puntatore */ op = operaz(1); /* scelta op. */ y = (*op)(12, 23); 15 Valore restituito da funzione Secondo metodo (meno chiaro) Si scrive ogni cast esplicitamente int (* operaz(int f))(int,int) static int (* fpv[2])(int,int) = piu,meno; return fpv[f]; La funzione definita è operaz e f ne è l argomento la parte non sottolineata è il tipo della funzione restituita da operaz (dove (int,int) sono i parametri della funzione restituita) static è riferito a fpv 16

5 Valore restituito da funzione 17 Cast 18 Secondo metodo (Continuazione) int y; int (*op)(int,int);/*puntatore */ op = operaz(1); /* scelta op. */ y = (*op)(12, 23); Un cast di tipo puntatore-a-funzione fa credere al compilatore che la funzione a cui viene applicato abbia il tipo di quella del puntatore Si ricorda che il tipo di una funzione è definito dal tipo e numero dei parametri e dal tipo del valore restituito Il cast può essere premesso al nome di una funzione o a un puntatore a funzione Attenzione che il cast di tipo puntatore-afunzione non applica anche il cast agli argomenti e al valore restituito Cast Il cast di puntatore-a-funzione può essere utilizzato per rendere una funzione compatibile con quella richiesta come argomento da un altra funzione E indispensabile che gli argomenti siano comunque compatibili (in generale sono puntatori) Si veda l esempio del qsort seguente 19 qsort La funzione qsort in <stdlib.h> ordina un vettore, deve essere chiamata indicando il nome della funzione da usare per il confronto degli elementi, il suo prototipo è: void qsort( void *base, puntatore al vett da riordinare size_t n, sua dim (numero di elementi) size_t size, dim di ogni elemento (in byte) int (*cmp)(const void*,const void*)) cmp è il puntatore alla funzione da utilizzare per confrontare due elementi di quel vettore 20

6 21 qsort La funzione passata per cmp deve: avere come argomenti due puntatori agli elementi del vettore da confrontare (qsort passerà a cmp gli indirizzi dei due elementi mediante &base[i]) restituire un valore int: <0 se il 1 o elemento è minore del 2 o 0 se sono uguali >0 se il 1 o è maggiore del 2 o La clausola const indica che gli oggetti da confrontare non saranno modificati Il tipo void* permette di passare puntatori di qualsiasi tipo: sarà la funzione passata ad utilizzarli ritrasformandoli al tipo corretto qsort su vettore di interi #include <stdlib.h> #include <stdio.h> int cfr(const int *a, const int *b) if (*a < *b) return -1; else if (*a > *b) return +1; else return 0; int vett[10] = 3,2,5,4,7,9,0,1,6,8; qsort(vett, 10, sizeof(int), (int (*)(const void*,const void*))cfr ); 22 qsort su vettore di interi La funzione passata cfr ha prototipo non identico a quello richiesto, ma compatibile (i puntatori sono sempre assegnabili gli uni agli altri anche se di tipo diverso); quindi viene fatto un cast della funzione passata: (int (*)(const void*,const void*))cfr I valori che la funzione qsort passa automaticamente a cfr per essere confrontati sono i vari &vett[i] che vengono usati come puntatori a int (quali sono) 23 qsort su vettore di stringhe Per ordinare con qsort un vettore di stringhe char *vs[10] non si può utilizzare direttamente strcmp Gli elementi che qsort() passerebbe alla funzione di confronto sarebbero &vs[i], cioè i puntatori (indirizzi) ai puntatori agli elementi, mentre strcmp() richiede puntatori a char 24

7 25 qsort su vettore di stringhe Bisogna definire una funzione ausiliaria: int cp(const void *p1,const void *p2) return strcmp(*(char * const *)p1, *(char * const *)p2); Gli argomenti di cp sono generici puntatori costanti a void (const void * ), il cast (char * const *) li riconverte nel loro vero tipo (puntatore a puntatore costante a char) e la deferenziazione produce un puntatore costante a char come la strcmp richiede qsort su vettore di strutture Per ordinare un vettore di struct bisogna definire una funzione di confronto ausiliaria: int structcmp(const void *p1, const void *p2) const struct nome *sp1; const struct nome *sp2; sp1=(const struct nome *)p1; sp2=(const struct nome *)p2; if (sp1->membro > sp2->membro) return +1; else if ( Esercizi 1. Scrivere un programma che riordini con qsort un vettore di stringhe 2. Scrivere un programma che 1. definisca un vettore di 10 struct contenenti due valori interi x e y 2. inizializzi il vettore 3. ordini il vettore con qsort in base alla somma dei valori (se due somme sono uguali, il confronto è tra i primi membri, es. 4,6>3,7) 4. cerchi un elemento, dati i due valori in input, con la bsearch di <stdlib.h> e ne fornisca l indice 27

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine

Dettagli

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli

Dettagli

Tipicamente un elaboratore è capace di trattare domini di dati di tipi primitivi

Tipicamente un elaboratore è capace di trattare domini di dati di tipi primitivi TIPI DI DATO Tipicamente un elaboratore è capace di trattare domini di dati di tipi primitivi numeri naturali, interi, reali caratteri e stringhe di caratteri e quasi sempre anche collezioni di oggetti,

Dettagli

Gestione dei File in C

Gestione dei File in C Gestione dei File in C Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania mpalesi@diit.unict.it http://www.diit.unict.it/users/mpalesi Sommario In questo documento saranno introdotte

Dettagli

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura Struttura a record 2 File ad accesso diretto Il file è organizzato in record aventi tutti la stessa struttura e quindi dimensione record 0 record 1 record 2 Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione

Dettagli

Introduzione alla Programmazione ad Oggetti in C++

Introduzione alla Programmazione ad Oggetti in C++ Introduzione alla Programmazione ad Oggetti in C++ Lezione 1 Cosa è la Programmazione Orientata agli Oggetti Metodologia per costruire prodotti software di grosse dimensioni che siano affidabili e facilmente

Dettagli

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp. 305-341 KP Cap. 6 pp. 241-247

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp. 305-341 KP Cap. 6 pp. 241-247 Cos è una stringa (1) Stringhe DD Cap. 8 pp. 305-341 KP Cap. 6 pp. 241-247 Una stringa è una serie di caratteri trattati come una singola unità. Essa potrà includere lettere, cifre, simboli e caratteri

Dettagli

APPLICAZIONI SU PIU FILE

APPLICAZIONI SU PIU FILE APPLICAZIONI SU PIU FILE Serve poter sviluppare applicazioni su piú file: - alcune funzioni e alcune definizioni di dati in un file - altre funzioni e dati in file diversi Perché?? 1. Se il programma è

Dettagli

Introduzione al linguaggio C Gli array

Introduzione al linguaggio C Gli array Introduzione al linguaggio C Gli array Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome

Dettagli

Visibilità dei Membri di una Classe

Visibilità dei Membri di una Classe Visibilità dei Membri di una Classe Lezione 10 Ogni classe definisce un proprio scope racchiude il codice contenuto nella definizione della classe e di tutti i suoi membri ogni metodo della classe definisce

Dettagli

ALGEBRA: LEZIONI DAL 13 OTTOBRE AL 3 NOVEMBRE

ALGEBRA: LEZIONI DAL 13 OTTOBRE AL 3 NOVEMBRE ALGEBRA: LEZIONI DAL 13 OTTOBRE AL 3 NOVEMBRE 1 DIPENDENZA E INDIPENDENZA LINEARE Se ho alcuni vettori v 1, v 2,, v n in uno spazio vettoriale V, il sottospazio 1 W = v 1,, v n di V da loro generato è

Dettagli

C / Dev-C++ procedurale Prof. Claudio Maccherani 2008/09

C / Dev-C++ procedurale Prof. Claudio Maccherani 2008/09 C / Dev-C++ procedurale Prof. Claudio Maccherani 2008/09 Nel 1972, presso i laboratori della AT&T, Tennis Ritchie realizza il linguaggio C per sviluppare il sistema operativo UNIX, svincolandosi così dall

Dettagli

Gli algoritmi. Gli algoritmi. Analisi e programmazione

Gli algoritmi. Gli algoritmi. Analisi e programmazione Gli algoritmi Analisi e programmazione Gli algoritmi Proprietà ed esempi Costanti e variabili, assegnazione, istruzioni, proposizioni e predicati Vettori e matrici I diagrammi a blocchi Analisi strutturata

Dettagli

CAPITOLO PRIMO IL CONCETTO DI ALGORITMO 1

CAPITOLO PRIMO IL CONCETTO DI ALGORITMO 1 1.1 Che cos è un algoritmo CAPITOLO PRIMO IL CONCETTO DI ALGORITMO 1 Gli algoritmi sono metodi per la soluzione di problemi. Possiamo caratterizzare un problema mediante i dati di cui si dispone all inizio

Dettagli

Matematica B - a.a 2006/07 p. 1

Matematica B - a.a 2006/07 p. 1 Matematica B - a.a 2006/07 p. 1 Definizione 1. Un sistema lineare di m equazioni in n incognite, in forma normale, è del tipo a 11 x 1 + + a 1n x n = b 1 a 21 x 1 + + a 2n x n = b 2 (1) = a m1 x 1 + +

Dettagli

Fondamenti di Informatica T. Linguaggio C: File

Fondamenti di Informatica T. Linguaggio C: File Linguaggio C: File I File Il file e` l'unita` logica di memorizzazione dei dati su memoria di massa, che consente una memorizzazione persistente dei dati, non limitata dalle dimensioni della memoria centrale.

Dettagli

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI Indice 1 Le frazioni algebriche 1.1 Il minimo comune multiplo e il Massimo Comun Divisore fra polinomi........ 1. Le frazioni algebriche....................................

Dettagli

Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora:

Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora: Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora: G.C.D.( a d, b d ) = 1 Sono state introdotte a lezione due definizioni importanti che ricordiamo: Definizione

Dettagli

Lab. 1 - Introduzione a Matlab

Lab. 1 - Introduzione a Matlab Lab. 1 - Introduzione a Matlab Alcune informazioni su Matlab Matlab è uno strumento per il calcolo scientifico utilizzabile a più livelli, dalla calcolatrice tascabile, alla simulazione ed analisi di sistemi

Dettagli

24 : 3 = 8 con resto 0 26 : 4 = 6 con resto 2

24 : 3 = 8 con resto 0 26 : 4 = 6 con resto 2 Dati due numeri naturali a e b, diremo che a è divisibile per b se la divisione a : b è esatta, cioè con resto 0. In questo caso diremo anche che b è un divisore di a. 24 : 3 = 8 con resto 0 26 : 4 = 6

Dettagli

1. Intorni di un punto. Punti di accumulazione.

1. Intorni di un punto. Punti di accumulazione. 1. Intorni di un punto. Punti di accumulazione. 1.1. Intorni circolari. Assumiamo come distanza di due numeri reali x e y il numero non negativo x y (che, come sappiamo, esprime la distanza tra i punti

Dettagli

Metodi risolutivi per le disequazioni algebriche

Metodi risolutivi per le disequazioni algebriche Metodi risolutivi per le disequazioni algebriche v.scudero Una disequazioni algebrica si presenta in una delle quattro forme seguenti: () P( () P( (3) P( () P( essendo P( un polinomio in. Noi studieremo

Dettagli

Esercizi su lineare indipendenza e generatori

Esercizi su lineare indipendenza e generatori Esercizi su lineare indipendenza e generatori Per tutto il seguito, se non specificato esplicitamente K indicherà un campo e V uno spazio vettoriale su K Cose da ricordare Definizione Dei vettori v,,v

Dettagli

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo Logica Numerica Approfondimento E. Barbuto Minimo Comune Multiplo e Massimo Comun Divisore Il concetto di multiplo e di divisore Considerato un numero intero n, se esso viene moltiplicato per un numero

Dettagli

Gestione dinamica di una pila

Gestione dinamica di una pila Gestione dinamica di una pila Una pila o stack è una lista lineare a lunghezza variabile in cui inserimenti (push) ed estrazioni (pop) vengono effettuate ad un solo estremo, detto testa (top) della pila.

Dettagli

Proof. Dimostrazione per assurdo. Consideriamo l insieme complementare di P nell insieme

Proof. Dimostrazione per assurdo. Consideriamo l insieme complementare di P nell insieme G Pareschi Principio di induzione Il Principio di Induzione (che dovreste anche avere incontrato nel Corso di Analisi I) consente di dimostrare Proposizioni il cui enunciato è in funzione di un numero

Dettagli

Da una a più variabili: derivate

Da una a più variabili: derivate Da una a più variabili: derivate ( ) 5 gennaio 2011 Scopo di questo articolo è di evidenziare le analogie e le differenze, relativamente al calcolo differenziale, fra le funzioni di una variabile reale

Dettagli

Appunti di Logica Matematica

Appunti di Logica Matematica Appunti di Logica Matematica Francesco Bottacin 1 Logica Proposizionale Una proposizione è un affermazione che esprime un valore di verità, cioè una affermazione che è VERA oppure FALSA. Ad esempio: 5

Dettagli

MATRICI E DETERMINANTI

MATRICI E DETERMINANTI MATRICI E DETERMINANTI 1. MATRICI Si ha la seguente Definizione 1: Un insieme di numeri, reali o complessi, ordinati secondo righe e colonne è detto matrice di ordine m x n, ove m è il numero delle righe

Dettagli