introduzione al linguaggio c uso delle funzioni. introduzione al linguaggio c uso delle funzioni...
TRANSCRIPT
Introduzione al linguaggio C
Uso delle funzioni
Uso delle funzioni
Introduzione al linguaggio C
Uso delle funzioni
Copyright © 1997 by Mario G. Montobbio
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of the author.
Mario G. Montobbio
mailto:[email protected]
Permission to use, copy and distribute this publication for the purposes of research or private study without fee is hereby granted, provided that this copyright notice and this permission notice appear in all copies.
Introduzione al linguaggio C
Funzione di partenza
Funzione di partenza
Introduzione al linguaggio C
Funzione di partenza
Costruiamo una semplice applicazione C che stampa due valori ...
main
Valore1 = 5Valore2 = 10
Stampa valori originali
Transito = Valore 1Valore 1 = Valore 2Valore 2 = Transito
Stampa valori scambiati
end
Introduzione al linguaggio C
Funzione di partenza
... poi scambia i valori fra di loro ...
main
Valore1 = 5Valore2 = 10
Stampa valori originali
Transito = Valore 1Valore 1 = Valore 2Valore 2 = Transito
Stampa valori scambiati
end
Introduzione al linguaggio C
Funzione di partenza
main
Valore1 = 5Valore2 = 10
Stampa valori originali
Transito = Valore 1Valore 1 = Valore 2Valore 2 = Transito
Stampa valori scambiati
end
... poi li ri-stampa dopo lo scambio.
Introduzione al linguaggio C
Funzione di partenza
Costruiamo due versioni di questa applicazione: la prima versione è composta da un’unica funzione main ...
main
Valore1 = 5Valore2 = 10
Stampa valori originali
Transito = Valore 1Valore 1 = Valore 2Valore 2 = Transito
Stampa valori scambiati
end
Introduzione al linguaggio C
Funzione di partenza
main
Valore1 = 5Valore2 = 10
Stampa valori originali
Transito = Valore 1Valore 1 = Valore 2Valore 2 = Transito
Stampa valori scambiati
end
... nella seconda applicazione isoliamo il passo di scampio dei valori in una funzione Scambio poiché pensiamo che in altre applicazioni ci capiterà di scambiare due valori.
Introduzione al linguaggio C
Funzione di partenza
main
Valore1 = 5Valore2 = 10
Stampa valori originali
Scambio
Stampa valori scambiati
end
... nella seconda applicazione isoliamo il passo di scampio dei valori in una funzione Scambio poiché pensiamo che in altre applicazioni ci capiterà di scambiare due valori.
Introduzione al linguaggio C
1 #include <stdio.h>
2 main (void)
3 {
4 int aValore1 = 5;
5 int aValore2 = 10;
6 int aTransito;
7 printf
8 (“Valori originali, Val1 = %d, Val2 = %d.\n”
9 ,aValore1, aValore2);
... ...
Funzione di partenza
Questa è l’applicazione C in un’unica funzione main.
Introduzione al linguaggio C
1 #include <stdio.h>
2 main (void)
3 {
4 int aValore1 = 5;
5 int aValore2 = 10;
6 int aTransito;
7 printf
8 (“Valori originali, Val1 = %d, Val2 = %d.\n”
9 ,aValore1, aValore2);
... ...
Funzione di partenza
Dichiariamo un’area intera denominata aValore1 e la inizializziamo al valore 5.
Introduzione al linguaggio C
1 #include <stdio.h>
2 main (void)
3 {
4 int aValore1 = 5;
5 int aValore2 = 10;
6 int aTransito;
7 printf
8 (“Valori originali, Val1 = %d, Val2 = %d.\n”
9 ,aValore1, aValore2);
... ...
Funzione di partenza
Dichiariamo un’area intera denominata aValore2 e la inizializziamo al valore 10.
Introduzione al linguaggio C
1 #include <stdio.h>
2 main (void)
3 {
4 int aValore1 = 5;
5 int aValore2 = 10;
6 int aTransito;
7 printf
8 (“Valori originali, Val1 = %d, Val2 = %d.\n”
9 ,aValore1, aValore2);
... ...
Funzione di partenza
Riserviamo un’area intera denominata aTransito che useremo come area di transito per lo scambio dei valori.
Introduzione al linguaggio C
1 #include <stdio.h>
2 main (void)
3 {
4 int aValore1 = 5;
5 int aValore2 = 10;
6 int aTransito;
7 printf
8 (“Valori originali, Val1 = %d, Val2 = %d.\n”
9 ,aValore1, aValore2);
... ...
Funzione di partenza
Stampiamo i valori prima dello scambio.
Introduzione al linguaggio C
... ...
10 aTransito = aValore1;
11 aValore1 = aValore2;
12 aValore2 = aTransito;
13 printf
14 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
16 }
Funzione di partenza
Scambiamo i valori appoggiandone uno sull’area denominata aTransito.
aTransito
theParm1
theParm2
5
5
101
2
3
Introduzione al linguaggio C
... ...
10 aTransito = aValore1;
11 aValore1 = aValore2;
12 aValore2 = aTransito;
13 printf
14 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
16 }
Funzione di partenza
Stampiamo i valori dopo lo scambio.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova6.c
2 home/mntmgs/clang>
Compilazione
Abbiamo introdotto il codice simbolico in prova6.c.
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova6.c
2 home/mntmgs/clang>
Compilazione
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova6.c
2 home/mntmgs/clang>
Compilazione
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza che siano stati emessi messaggi di errore: vuole dire che il codice non contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 10, Val2 = 5.
4 home/mntmgs/clang>
Elaborazione
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 10, Val2 = 5.
4 home/mntmgs/clang>
Elaborazione
... che si trova nella directory corrente.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 10, Val2 = 5.
4 home/mntmgs/clang>
Elaborazione
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi i valori prima e dopo lo scambio.
Introduzione al linguaggio C
Isolamento dello scambio in una funzione
Isolamento dello scambio in una funzione
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
Questa è la funzione Scambio.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
La funzione Scambio ha due argomenti formali denominati theParm1, e theParm2.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
L’argomento theParm1 è di tipo int ...
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
... ed anche l’argomento theParm2 è di tipo int.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
La funzione Scambio non restituisce alcun valore alla funzione che l’ha richiamata.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
Il corpo della funzione Scambio è compreso fra la coppia di parentesi graffe { }
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
Riserviamo un’area intera denominata aTransito che useremo come area di transito per lo scambio dei valori..
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
Scambiamo i valori appoggiandone uno sull’area denominata aTransito.
aTransito
theParm1
theParm2
5
5
101
2
3
Introduzione al linguaggio C
... ...
9 main (void)
10 {
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Isolamento dello scambio in una funzione
Esaminiamo la nuova versione della funzione main.
Introduzione al linguaggio C
... ...
9 main (void)
10 {
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Isolamento dello scambio in una funzione
Dichiariamo un’area intera denominata aValore1 e la inizializziamo al valore 5.
Introduzione al linguaggio C
... ...
9 main (void)
10 {
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Isolamento dello scambio in una funzione
Dichiariamo un’area intera denominata aValore2 e la inizializziamo al valore 10.
Introduzione al linguaggio C
... ...
9 main (void)
10 {
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Isolamento dello scambio in una funzione
Stampiamo i valori prima dello scambio.
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Isolamento dello scambio in una funzione
Richiamiamo la funzione Scambio ...
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Isolamento dello scambio in una funzione
... passandole gli argomenti reali fra la coppia di parentesi tonde ( ) e separati da virgole ,
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Isolamento dello scambio in una funzione
Il primo argomento reale aValore1 ...
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
... corrisponde al primo argomento formale theParm1 ...
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Isolamento dello scambio in una funzione
... mentre il secondo argomento reale aValore2 ...
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Isolamento dello scambio in una funzione
... corrisponde al secondo argomento formale theParm2.
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Isolamento dello scambio in una funzione
Stampiamo i valori dopo lo scambio.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova7.c
2 home/mntmgs/clang>
Compilazione
Abbiamo introdotto il codice simbolico in prova7.c.
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova7.c
2 home/mntmgs/clang>
Compilazione
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova7.c
2 home/mntmgs/clang>
Compilazione
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza che siano stati emessi messaggi di errore: vuole dire che il codice non contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 5, Val2 = 10.
4 home/mntmgs/clang>
Elaborazione
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 5, Val2 = 10.
4 home/mntmgs/clang>
Elaborazione
... che si trova nella directory corrente.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 5, Val2 = 10.
4 home/mntmgs/clang>
Elaborazione
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi i valori prima e dopo lo scambio.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori scambiati, Val1 = 5, Val2 = 10.
4 home/mntmgs/clang>
Elaborazione
I valori prima e dopo lo scambio sono uguali.
Introduzione al linguaggio C
Elaborazione
5 10?
Introduzione al linguaggio C
Passaggio di argomenti per valore
Passaggio argomenti per valore
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Passaggio di argomenti per valore
Il richiamo della funzione Scambio ...
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
... ...
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
... ...
Passaggio di argomenti per valore
... valorizza theParm1 con il contenuto di aValore1 ...
theParm1aValore15
Introduzione al linguaggio C
... ...
16 Scambio (aValore1, aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
... ...
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
... ...
Passaggio di argomenti per valore
... e valorizza theParm2 con il contenuto di aValore2 ...
theParm2aValore210
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per valore
La funzione Scambio scambia i valori delle aree theParm1 e theParm2 ...
aTransito
theParm1
theParm2
5
5
10
1
2
3aValore2
aValore1 5
10
Introduzione al linguaggio C
... ...
9 main (void)
10 {
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Passaggio di argomenti per valore
... e non quelli delle aree di partenza aValore1 e aValore2.
aValore2
aValore1
aTransito
theParm1
theParm2
5
5
105
10 3
1
2
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per valore
Gli argomenti formali theParm1 e theParm2 sono copie delle aree aValore1 ed aValore2 ...
theParm2aValore210
theParm1aValore15
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int theParm1, int theParm2)
3 {
4 int aTransito;
5 aTransito = theParm1;
6 theParm1 = theParm2;
7 theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per valore
... e non “maschere” per accedere alle aree aValore1 ed aValore2.
theParm2
aValore2 10
theParm1
aValore1 5
Introduzione al linguaggio C
Nota per i programmatori COBOL
Nota per i programmatori COBOL
Introduzione al linguaggio C
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. “SCAMBIO”.
... ...
3 WORKING-STORAGE SECTION.
4 01 A-TRANSITO PIC S9(9) COMP.
5 LINKAGE SECTION.
6 01 THE-PARM1 PIC S9(9) COMP.
7 01 THE-PARM2 PIC S9(9) COMP.
8 PROCEDURE DIVISION
9 USING THE-PARM1, THE-PARM2.
10 MOVE THE-PARM1 TO A-TRANSITO.
11 MOVE THE-PARM2 TO THE-PARM1.
12 MOVE A-TRANSITO TO THE-PARM2.
... ...
Nota per i programmatori COBOL
In COBOL gli argomenti formali sono “maschere” per accedere ...
theParm2
theParm1
Introduzione al linguaggio C
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. “MAIN”.
... ...
3 WORKING-STORAGE SECTION.
4 01 A-VALORE1 PIC S9(9) COMP VALUE +5.
5 01 A-VALORE2 PIC S9(9) COMP VALUE +10.
6 PROCEDURE DIVISION.
7 CALL “SCAMBIO”
8 USING A-VALORE1,
9 A-VALORE2.
... ...
Nota per i programmatori COBOL
... con altri nomi alle aree di partenza A-VALORE1 ed A-VALORE2.
theParm2
theParm1
+5
+10
Introduzione al linguaggio C
Passaggio di argomenti per indirizzo
Passaggio argomenti per indirizzo
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
In questa versione passiamo alla funzione Scambio gli indirizzi delle aree da scambiare.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Gli argomenti theParm1 e theParm2 sono diventati puntatori ad aree di tipo int.
Introduzione al linguaggio C
... ...
16 Scambio (&aValore1, &aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Passaggio di argomenti per indirizzo
La funzione main passa alla funzione Scambio gli indirizzi delle area da scambiare e non una copia delle aree.
Introduzione al linguaggio C
... ...
16 Scambio (&aValore1, &aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Passaggio di argomenti per indirizzo
L’operatore & calcola l’indirizzo dell’area aValore1.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
... che viene copiato nel puntatore theParm1.
Introduzione al linguaggio C
... ...
16 Scambio (&aValore1, &aValore2);
17 printf
28 (“Valori scambiati, Val1 = %d, Val2 = %d.\n”
29 ,aValore1, aValore2);
30 }
Passaggio di argomenti per indirizzo
L’operatore & calcola l’indirizzo dell’area aValore2.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
... che viene copiato nel puntatore theParm2.
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Per estrarre il contenuto di aValore1 tramite il puntatore aParm1 usiamo l’operatore di de-referenziamento *
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Questa dichiarazione estrae il contenuto di aValore1 e lo assegna all’area aTransito.
aValore2
aValore1
aTransito
*theParm1
*theParm2
5
5
10
1
25
10 3
1
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Per estrarre il contenuto di aValore2 tramite il puntatore aParm2 usiamo l’operatore di de-referenziamento *
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Per assegnare un valore ad aValore1 tramite il puntatore aParm1 usiamo l’operatore di de-referenziamento *
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Questa dichiarazione estrae il contenuto di aValore2 e lo assegna all’area aValore1.
aValore2
aValore1
aTransito
*theParm1
*theParm2
5
5
10
1
210
10 3
2
Introduzione al linguaggio C
... ...
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Passaggio di argomenti per indirizzo
Dopo l’elaborazione di questa dichiarazione il valore dell’area aValore1 è cambiato da 5 a 10.
aValore2
aValore1
aTransito
theParm1
theParm2
5
5
10
1
210
10 3
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Per assegnare un valore ad aValore2 tramite il puntatore aParm2 usiamo l’operatore di de-referenziamento *
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Passaggio di argomenti per indirizzo
Questa dichiarazione estrae il contenuto di aTransito e lo assegna all’area aValore2.
aValore2
aValore1
aTransito
*theParm1
*theParm2
5
5
10
1
210
5 3
3
Introduzione al linguaggio C
... ...
11 int aValore1 = 5;
12 int aValore2 = 10;
13 printf
14 (“Valori originali, Val1 = %d, Val2 = %d.\n”
15 ,aValore1, aValore2);
... ...
Passaggio di argomenti per indirizzo
Dopo l’elaborazione di questa dichiarazione il valore dell’area aValore2 è cambiato da 10 a 5.
aValore2
aValore1
aTransito
theParm1
theParm2
5
5
10
1
210
5 3
Introduzione al linguaggio C
Puntatori a funzioni
Puntatori a funzioni
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Puntatori a funzioni
Esaminiamo il modello della funzione Scambio ...
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Puntatori a funzioni
... la funzione Scambio ha due argomenti di tipo int * ...
Introduzione al linguaggio C
1 #include <stdio.h>
2 void Scambio (int *theParm1, int *theParm2)
3 {
4 int aTransito;
5 aTransito = *theParm1;
6 *theParm1 = *theParm2;
7 *theParm2 = aTransito;
8 }
... ...
Puntatori a funzioni
... e non restituisce alcun valore.
Introduzione al linguaggio C
... ...
9 void Somma (int *theParm1, int *theParm2)
10 {
11 *theParm1 += *theParm2;
12 }
... ...
Puntatori a funzioni
Costruiamo una funzione Somma che ha lo stesso modello della funzione Scambio ...
Introduzione al linguaggio C
... ...
9 void Somma (int *theParm1, int *theParm2)
10 {
11 *theParm1 += *theParm2;
12 }
... ...
Puntatori a funzioni
... cioè anche la funzione Somma ha due argomenti di tipo int * ...
Introduzione al linguaggio C
... ...
9 void Somma (int *theParm1, int *theParm2)
10 {
11 *theParm1 += *theParm2;
12 }
... ...
Puntatori a funzioni
... e non restituisce alcun valore.
Introduzione al linguaggio C
... ...
9 void Somma (int *theParm1, int *theParm2)
10 {
11 *theParm1 += *theParm2;
12 }
... ...
Puntatori a funzioni
La funzione Somma estrae il contenuto di aValore2 usando il puntatore theParm2 mediante l’operatore di de-referenziamento * ...
Introduzione al linguaggio C
... ...
9 void Somma (int *theParm1, int *theParm2)
10 {
11 *theParm1 += *theParm2;
12 }
... ...
Puntatori a funzioni
... e lo somma al contenuto di aValore1 usando il puntatore theParm1 mediante l’operatore di de-referenziamento *.
Introduzione al linguaggio C
... ...
9 void Somma (int *theParm1, int *theParm2)
10 {
11 *theParm1 += *theParm2;
12 }
... ...
Puntatori a funzioni
L’operatore += incrementa il contenuto dell’area a primo membro con il contenuto dell’area a secondo membro.
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Costruiamo un vettore di puntatori a funzioni nel corpo della funzione main.
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Questo è un vettore ...
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
... che contiene due elementi.
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Ogni elemento del vettore è un puntatore a funzione.
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Ogni funzione puntata ha due argomenti di tipo int * ...
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
... e non restituisce alcun valore.
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Il primo puntatore a funzione del vettore punta alla funzione Scambio.
Introduzione al linguaggio C
... ..
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Il secondo puntatore a funzione del vettore punta alla funzione Somma.
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Puntatori a funzioni
Per elaborare il vettore dichiariamo un’indice che identifica l’elemento corrente.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Stampiamo i contenuti di aValore1 ed aValore2 prima di ogni modifica.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Richiamiamo in ciclo le funzioni puntate del vettore.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Il ciclo inizia con il primo elemento del vettore.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Dopo ogni ciclo incrementiamo l’indice aIndex per elaborare l’elemento seguente del vettore di puntatori.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Il ciclo termina quando tutti gli elementi del vettore sono stati elaborati.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Richiamiamo la funzione puntata dall’elemento corrente del vettore di puntatori a funzione.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Puntatori a funzioni
Stampiamo i valori dopo la modifica.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova8.c
2 home/mntmgs/clang>
Compilazione
Abbiamo introdotto il codice simbolico in prova8.c.
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova8.c
2 home/mntmgs/clang>
Compilazione
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
1 home/mntmgs/clang>cc prova8.c
2 home/mntmgs/clang>
Compilazione
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza che siano stati emessi messaggi di errore: vuole dire che il codice non contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori modificati, Val1 = 10, Val2 = 5.
4 Valori modificati, Val1 = 15, Val2 = 5.
5 home/mntmgs/clang>
Elaborazione
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori modificati, Val1 = 10, Val2 = 5.
4 Valori modificati, Val1 = 15, Val2 = 5.
5 home/mntmgs/clang>
Elaborazione
... che si trova nella directory corrente.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori modificati, Val1 = 10, Val2 = 5.
4 Valori modificati, Val1 = 15, Val2 = 5.
5 home/mntmgs/clang>
Elaborazione
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi i valori prima e dopo le modifiche.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori modificati, Val1 = 10, Val2 = 5.
4 Valori modificati, Val1 = 15, Val2 = 5.
5 home/mntmgs/clang>
Elaborazione
I valori dopo la prima modifica sono stati scambiati fra loro.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Elaborazione
Quando l’indice aIndex vale 0 la funzione main richiama la funzione Scambio ...
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Elaborazione
... poiché il primo puntatore a funzione del vettore punta alla funzione Scambio.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Valori originali, Val1 = 5, Val2 = 10.
3 Valori modificati, Val1 = 10, Val2 = 5.
4 Valori modificati, Val1 = 15, Val2 = 5.
5 home/mntmgs/clang>
Elaborazione
Dopo la seconda modifica il contenuto di aValore1 è stato incrementato del contenuto dell’area aValore2.
Introduzione al linguaggio C
... ...
22 printf
23 ("Valori originali, Val1 = %d, Val2 = %d.\n"
24 ,aValore1, aValore2);
25 for (aIndex = 0; aIndex < 2; ++aIndex)
26 {
27 aFunction_Ptr[aIndex] (&aValore1, &aValore2);
28 printf
29 ("Valori modificati, Val1 = %d, Val2 = %d.\n"
30 ,aValore1, aValore2);
31 }
32 }
Elaborazione
Quando l’indice aIndex vale 1 la funzione main richiama la funzione Somma ...
Introduzione al linguaggio C
... ...
13 main (void)
14 {
15 void (*aFunction_Ptr[2])
16 (int *theInt1_Ptr, int *theInt2_Ptr);
17 int aValore1 = 5;
18 int aValore2 = 10;
19 int aIndex;
20 aFunction_Ptr[0] = Scambio;
21 aFunction_Ptr[1] = Somma;
... ...
Elaborazione
... poiché il secondo puntatore a funzione del vettore punta alla funzione Somma.
Introduzione al linguaggio C
Elaborazione
A cosa serve
un vettore di
puntatori a
funzione?
Introduzione al linguaggio C
Costruzione di oggetti
Costruzione di oggetti
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Il linguaggio C permette di costruire un modello di aggregato che contiene solamente puntatori a funzione.
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Questi sono puntatori a funzione.
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Is_Type punta ad una funzione ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... che non ha argomenti ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... e restituisce un puntatore a carattere.
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Displayable_Format punta ad una funzione ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... che non ha argomenti ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... e restituisce un puntatore a carattere.
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Is_Container punta ad una funzione ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... che non ha argomenti ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... e restituisce un valore di tipo int.
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Clonate punta ad una funzione ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... che non ha argomenti ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... e restituisce un puntatore ad un’area di formato non specificato.
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
Delete punta ad una funzione ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... che non ha argomenti ...
Introduzione al linguaggio C
1 struct Component_Tag
2 {
3 char* (*Is_Type) (void);
4 char* (*Displayable_Format) (void);
5 int (*Is_Container) (void);
6 void* (*Clonate) (void);
7 void (*Delete) (void);
8 };
Costruzione di oggetti
... e non restituisce alcun valore.
Introduzione al linguaggio C
1 char *Type_Integer (void)
2 {
3 return "Integer";
4 }
5 char *Type_Text (void)
6 {
7 return "Text";
8 }
Costruzione di oggetti
La funzione Type_Integer identifica un primo tipo logico di componente rispondendo che è di tipo Integer.
Introduzione al linguaggio C
1 char *Type_Integer (void)
2 {
3 return "Integer";
4 }
5 char *Type_Text (void)
6 {
7 return "Text";
8 }
Costruzione di oggetti
La funzione Type_Text identifica un secondo tipo logico di componente rispondendo che è di tipo Text.
Introduzione al linguaggio C
1 main (void)
2 {
3 struct Component_Tag aComp[2];
4 aComp[0].Is_Type = Type_Integer;
5 aComp[1].Is_Type = Type_Text;
6 int aIndex;
7 for (aIndex = 0; aIndex < 2; ++aIndex)
8 {
9 char * aType_Ptr = aComp[aIndex].Is_Type();
10 printf ("Type = %s\n", aType_Ptr);
11 }
12 }
Costruzione di oggetti
Dichiariamo un vettore di aggregati di tipo Component_Tag (nome del programmatore).
Introduzione al linguaggio C
1 main (void)
2 {
3 struct Component_Tag aComp[2];
4 aComp[0].Is_Type = Type_Integer;
5 aComp[1].Is_Type = Type_Text;
6 int aIndex;
7 for (aIndex = 0; aIndex < 2; ++aIndex)
8 {
9 char * aType_Ptr = aComp[aIndex].Is_Type();
10 printf ("Type = %s\n", aType_Ptr);
11 }
12 }
Costruzione di oggetti
Il puntatore a funzione Is_Type del primo elemento del vettore punta alla funzione Type_Integer.
Introduzione al linguaggio C
1 main (void)
2 {
3 struct Component_Tag aComp[2];
4 aComp[0].Is_Type = Type_Integer;
5 aComp[1].Is_Type = Type_Text;
6 int aIndex;
7 for (aIndex = 0; aIndex < 2; ++aIndex)
8 {
9 char * aType_Ptr = aComp[aIndex].Is_Type();
10 printf ("Type = %s\n", aType_Ptr);
11 }
12 }
Costruzione di oggetti
Il puntatore a funzione Is_Type del secondo elemento del vettore punta alla funzione Type_Text.
Introduzione al linguaggio C
1 main (void)
2 {
3 struct Component_Tag aComp[2];
4 aComp[0].Is_Type = Type_Integer;
5 aComp[1].Is_Type = Type_Text;
6 int aIndex;
7 for (aIndex = 0; aIndex < 2; ++aIndex)
8 {
9 char * aType_Ptr = aComp[aIndex].Is_Type();
10 printf ("Type = %s\n", aType_Ptr);
11 }
12 }
Costruzione di oggetti
Quale funzione richiamiamo con questa dichiarazione?
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Type = Integer
3 Type = Text
4 home/mntmgs/clang>
Costruzione di oggetti
Al primo ciclo chiediamo al primo oggetto: “Tu di che tipo sei?”.
Il primo oggetto risponde: “Io sono di tipo Integer”.
Introduzione al linguaggio C
1 home/mntmgs/clang>./a.out
2 Type = Integer
3 Type = Text
4 home/mntmgs/clang>
Costruzione di oggetti
Al secondo ciclo chiediamo al secondo oggetto: “Tu di che tipo sei?”.
Il secondo oggetto risponde: “Io sono di tipo Text”.
Introduzione al linguaggio C
Costruzione di oggetti
L’uso di aggregati di puntatori a funzioni con questo stile ci porta nella direzione del linguaggio C++.
Is_Type
Integer
Is_Type
Is_Container
Elementary_Data_Item
Displayable_Format
Clonate
Displayable_Format
250
Is_Type
Real
Displayable_Format
1.25
Is_Type
Text
Displayable_Format
Ferruccio
Introduzione al linguaggio C
Costruzione di oggetti
Questo stesso esempio di aggregato è discusso usando il linguaggio C++ nel corso “Uso dei contenitori”.
Is_Type
Integer
Is_Type
Is_Container
Elementary_Data_Item
Displayable_Format
Clonate
Displayable_Format
250
Is_Type
Real
Displayable_Format
1.25
Is_Type
Text
Displayable_Format
Ferruccio
Introduzione al linguaggio C
Uso delle funzioni
Copyright © 1997 by Mario G. Montobbio
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of the author.
Mario G. Montobbio
mailto:[email protected]
Permission to use, copy and distribute this publication for the purposes of research or private study without fee is hereby granted, provided that this copyright notice and this permission notice appear in all copies.