Corso di Fondamenti di Informatica

Documenti analoghi
POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

Associazione Variabile-Indirizzo

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Puntatori in C Lucidi della Pof.ssa Pazienza

C: panoramica. Violetta Lonati

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Inside C : Puntatori. Indirizzo: operatore & p = &v; x = a; Puntatori Referenziazione e Dereferenziazione Arrays

Strategie di programmazione

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Allocazione dinamica della memoria

Introduzione al linguaggio C Puntatori

Il linguaggio C funzioni e puntatori

Concetto di Funzione e Procedura METODI in Java

Gli Array. Dichiarazione di un array

Il puntatore. Il puntatore

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Funzioni, Stack e Visibilità delle Variabili in C

Fondamenti di Informatica T. Linguaggio C: i puntatori

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Il linguaggio C. Puntatori e dintorni

Le funzioni. Fondamenti di programmazione

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

uguale livello gerarchico non vi sono funzioni più importanti di altre main main

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Lezione 6 Introduzione al C++ Mauro Piccolo

L'Allocazione Dinamica della Memoria nel linguaggio C

Tempo di vita e scope delle variabili

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Esercitazione 7

Concetti base programmazione. Antonio Gallo

Corso di Fondamenti di Informatica

Puntatori. Fondamenti di Programmazione

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

I puntatori (richiamo)

Linguaggio C: PUNTATORI

Introduzione al C++ (continua)

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Strutture Dati Dinamiche

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Allocazione statica della memoria

Il linguaggio C. Puntatori e Array

Le basi del linguaggio Java

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Programmazione Procedurale in Linguaggio C++

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Allocazione Dinamica della Memoria

Introduzione ai puntatori

Introduzione ai puntatori in C Definizione

Struttura dei programmi C

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

La gestione della memoria dinamica Heap

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Operatore di indirizzo

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

Array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 11. A. Miola Dicembre 2007

Array multidimensionali e stringhe

Modulo 2: Strutture fondamentali della programmazione Java

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Puntatori. Unità 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Indirizzi e tipi puntatore a

Programmazione con Java

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Laboratorio di linguaggi

cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe

Gestione dinamica della memoria

2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2) Fondamenti di Informatica.

Puntatori. Unità 6. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

LABORATORIO di INFORMATICA

Funzioni in C. Architetture multi-componente

Esercitazione 11. Liste semplici

Verso i puntatori: Cosa è una variabile?

Corso di Programmazione ad Oggetti

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Array e puntatori in C

Allocazione Dinamica della Memoria

Costanti e Variabili

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Il linguaggio C. Notate che...

Introduzione a Java. Riferimenti

Dati aggregati. Violetta Lonati

Passare argomenti al programma

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Perché il linguaggio C?

Laboratorio di Programmazione Anno Accademico

Linguaggio C I puntatori

Programmazione (imperativa)

L Allocazione Dinamica della Memoria

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

Transcript:

Corso di Fondamenti di Informatica Puntatori a funzioni 1

Funzioni che restituiscono puntatori Il valore di ritorno restituito da una funzione può essere di qualsiasi tipo, compreso il tipo puntatore. Es.: int* funz(); dichiara una funzione funz che restituisce un valore puntatore a int. In generale, il valore di ritorno, anche se é un puntatore, viene trasmesso by value e quindi ne viene creata una copia nel programma chiamante; ciò garantisce che il puntatore sopravviva alla funzione anche se è stato creato all'interno del suo ambito. Tuttavia la variabile puntata potrebbe non sopravvivere alla funzione (se é stata creata nel suo ambito e non dichiarata static). Ciò porterebbe a un errore di dangling references. Notare l'analogia con il tipo di errore generato quando un valore di ritorno, trasmesso by reference, corrisponde a una variabile che cessa di esistere: in quel caso tuttavia, il compilatore ha il controllo della situazione e quindi può segnalare l'errore (o almeno un warning); nel caso di un puntatore, invece, il suo contenuto (cioè l'indirizzo della variabile puntata) é determinato in esecuzione e quindi l'errore non può essere segnalato dal compilatore. Spetta al programmatore fare la massima attenzione a che ciò non si verifichi. 2

Funzioni che restituiscono puntatori Il più frequente uso di funzioni che restituiscono puntatori si ha nel caso di puntatori a char, cioè di stringhe. Nella stessa libreria Run-time ci sono molte funzioni che restituiscono stringhe. Esempio di funzione di libreria: char* strcat(char* str1, char* str2); concatena la stringa str2 alla stringa str1 e restituisce il risultato sia nella stessa str1 che come valore di ritorno. Notare che in questo caso non c'è pericolo di errore, purché lo spazio di memoria per str1 sia stato adeguatamente allocato nel programma chiamante. 3

Puntatori a Funzione In C++ esistono anche i puntatori a funzione! Questi servono quando il programma deve scegliere quale funzione chiamare fra diverse possibili, e la scelta non é definita a priori ma dipende dai dati del programma stesso. Questo processo si chiama late binding ("aggancio ritardato"): gli indirizzi delle funzioni da chiamare non vengono risolti al momento della compilazione, come avviene normalmente (early binding) ma al momento dell'esecuzione. I puntatori a funzione non devono essere definiti, ma solo dichiarati, come nel seguente esempio: int* (*pfunz)(double, char* ); dichiara un puntatore a funzione pfunz che restituisce un puntatore a int e ha due argomenti: il primo é di tipo double, il secondo é un puntatore a char. Notare le parentesi intorno al nome della funzione, in assenza delle quali la dichiarazione sarebbe interpretata in modo diverso (una normale funzione pfunz che restituisce un puntatore a puntatore a int). 4

Puntatori a Funzione Nel corso del programma il puntatore a funzione deve essere assegnato (o inizializzato) con il nome di una funzione "vera", che deve essere precedentemente dichiarata con lo stesso tipo del valore di ritorno e gli stessi argomenti del puntatore. Continuando l'esempio precedente: int* funz1(double, char* ); int* funz2(double, char* ); if (... ) pfunz = funz1 ; else pfunz = funz2; notare che i nomi delle funzioni e del puntatore vanno indicati da soli, senza i loro argomenti (e senza le parentesi). In una chiamata della funzione, il puntatore va dereferenziato (in realtà non é necessario): (*pfunz)(12.3,"ciao");... ma va bene anche: pfunz(12.3,"ciao"); 5

Array di puntatori a funzione In C++ è consentito dichiarare array di puntatori a funzione, nella forma specificata dal seguente esempio: double (*apfunz[5])(int); dichiara l'array apfunz di 5 puntatori a funzione, tutti con valore di ritorno di tipo double e con un argomento di tipo int. L'array può essere inizializzato con un elenco di nomi di funzioni, già dichiarate e condividenti tutte le stesso tipo di valore di ritorno e gli stessi argomenti: double (*apfunz[5])(int) = {f1, f2, f3, f4, f5} ; dove f1 ecc... sono tutte funzioni dichiarate: double f1(int); ecc... I singoli elementi dell'array possono anche essere assegnati tramite l'operatore [], che funziona come l-value nel modo consueto: apfunz[3]= fn; dove fn é una funzione dichiarata: double fn(int); 6

Array di puntatori a funzione Nelle chiamate, si usa ancora l'operatore [ ] per selezionare l'elemento desiderato: apfunz[i](n); (non é necessario dereferenziare il puntatore) dove l'indice i permette di accedere alla funzione precedentemente assegnata all'i-esimo elemento dell'array. Gli array di puntatori a funzione possono essere utili, per esempio, quando la funzione da eseguire é selezionata da un menù: in questo caso l'indice i, corrispondente a una voce di menù, indirizza direttamente la funzione prescelta, senza bisogno di istruzioni di controllo, come if o switch, per determinarla. 7

Funzioni con argomenti puntatori a funzione E' noto che, quando nella chiamata di una funzione compare come argomento un'altra funzione, questa viene eseguita per prima e il suo valore di ritorno é utilizzato come argomento dalla prima funzione. Quindi il vero argomento della prima funzione non é la seconda funzione, ma un normale valore, che può avere qualsiasi origine (variabile, espressione ecc...), e in particolare in questo caso è il risultato dell'esecuzione di un'altra funzione (il cui tipo di valore di ritorno deve coincidere con il tipo dichiarato dell'argomento). Quando invece una funzione dichiara fra i suoi argomenti un puntatore a funzione, allora sono parametrizzate proprio le funzioni e non i loro valori di ritorno. Nelle chiamate é necessario specificare come argomento il nome di una funzione "vera", precedentemente dichiarata, che viene sostituito a quello del puntatore. 8

Funzioni con argomenti puntatori a funzione Esempio dichiarazioni: void fsel(int (*)(float)); int funz1(float); int funz2(float); Esempio di chiamate: fsel(funz1); fsel(funz2); Definizione fsel: void fsel(int (*pfunz)(float)) {... n = pfunz(r);...} (dove n édi tipo int e r édi tipo float) l'istruzione n=pfunz(r) viene sostituita la prima volta con n=funz1(r) e la seconda volta con n=funz2(r). Notare che, nelle chiamate, l'argomento-funzione deve essere a sua volta specificato senza argomenti e senza le parentesi tonde. 9

Funzioni con argomenti puntatori a funzione Nell'esempio abbiamo supposto che la variabile r, argomento della pfunz, sia creata all'interno della fsel; anche se r fosse passato dal programma chiamante, la forma: fsel(funz1(r)) sarebbe comunque errata: l'unico modo per passare r potrebbe essere quello di dichiararlo come ulteriore argomento della fsel, cioè: void fsel(float, int (*pfunz)(float)); e nelle chiamate specificare: fsel(r, funz1);...oppure... fsel(r, funz2); 10