D:\development\java\netbeans\FirstC\function_ponters.c
 1 /*
 2  * A függvénymutatók használatát bemutató kód.
 3  * A három dátumkiíró függvény azonos paramétereket vár, és mindháromnak
 4  * void a visszatérési típusa. Azaz: ugyanolyan típusú függvénymutatókkal használhatjuk 
 5  * őket. 
 6  * A három fügvény különbözőképpen jeleníti meg a dátumokat. A megjelenítést
 7  * a valaszto nevű függvénnyel lehet megjeleníteni, ami egy függvénymutatót ad vissza.
 8  */
 9 #include<stdio.h>
10 #include<stdlib.h>
11 
12 /*
13  * Pontokkal elválasztva jeleníti meg a dátumot. Pl.: 2004.03.24
14  */
15 void datum_pontokkal(int ev, int ho, int nap){
16     printf("%d.%d.%d", ev, ho, nap);
17 }
18 
19 /*
20  * Angol-szerűen jeleníti meg a dátumot. Pl.: 24.03, 2007.
21  */
22 void datum_angolul(int ev, int ho, int nap){
23     printf("%d.%d, %d", nap, ho, ev);
24 }
25 
26 /*
27  * A hónapok neveit tartalmazó tömb. A szöveges megjelenítéshez kell.
28  */
29 char *honapok[] = {"január", "február", "március", "április", "május"
30         , "június", "július", "augisztus", "szeptember", "október", "november"
31         , "december"};
32 
33 /*
34  * Szövegesen jeleníti meg a dátumot. Pl.: 2007 március 24.
35  */
36 void datum_szoveggel(int ev, int ho, int nap){    
37     printf("%d %s %d.", ev, honapok[ho-1], nap);
38 }
39 
40 /*
41  * A megjelenítési típusokhoz rendelt konstansok.
42  */
43 enum tipusok {PONTOK, ANGOL, SZOVEGES};
44 
45 /*
46  * A függvény paraméterül kap egy egészet, majd visszaad egy függvénymutatót egy
47  * olyan függvényre, ami void visszatérési típusú, és három int paramétere van. 
48  * Az egész alapján dönti el, hogy melyik dátummegjelenítő függvény címét adja 
49  * vissza.
50  * A függvény definíciója leegyszerűsíthető, ha definiálunk egy szinonímát a függvény 
51  * mutató típusára:
52  *
53  *      typedef void (*FGVMUTATO)(int, int, int);
54  *
55  * Ekkor a függvény így nézne ki:
56  *      
57  *      FGVMUTATO valaszto(int){
58  *          ...
59  *      }
60  */
61 void (*valaszto(int tipus)) (int, int, int){
62     void (*honapozo)(int, int, int);
63     
64     switch(tipus){
65         case PONTOK: honapozo = datum_pontokkal;
66                 break;
67         case ANGOL: honapozo = datum_angolul;
68                 break;
69         default: honapozo = datum_szoveggel;
70                 break;
71     }
72     
73     return honapozo;
74 }
75 
76 int main(){
77     void (*honapozo)(int, int, int) = valaszto(ANGOL);
78     
79     honapozo(2007, 1, 10);
80     
81     return(EXIT_SUCCESS);
82 }
83 
84