5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1
Függvény definíció 1. [típus] függvénynév ([argumentum lista]) argumentum deklaráció { függvénytörzs } A függvény törzsében: return kifejezés A visszatérő érték tömb és függvény kivételével bármilyen típus lehet. Kerüljük a nagyméretű struktúrákat. Default: int, ha nincs: void 2
Függvény definíció 2. Az argumentum lista és az argumentum deklaráció összevonható. Pl. double vhossz(x, y, z) double x, y, z; { return (sqrt(x*x+y*y+z*z)); } vagy összevonva: double vhossz(double x, double y, double z) { ... } 3
Függvény definíció 3. Függvény definíciók nem ágyazhatók egymásba! A definícióban szereplő argumentum lista a formális paraméter lista. 4
Függvény hivatkozás 1. függvénynév (aktuális paraméter lista) Pl. c = vhossz (2.0, 4.1, 5.0); Paraméter átadási mechanizmusok: érték szerinti, cím szerinti. A C-ben csak érték szerinti. Cím szerinti: pointerrel. Az aktuális paraméterekről átmeneti másolat készül és ezek lokális változókként viselkednek. Az aktuális és a formális paraméter lista elemei között típusegyeztetés történik. 5
Függvény hivatkozás 2. Automatikus típus konverzió paraméter átadáskor: char, short -> int float -> double tömb -> pointer 6
Függvény deklaráció Minden hivatkozás előtt az adott szimbólumra vonatkozó összes információnak rendelkezésre kell állnia. Prototípus: típus függvénynév (típus lista); Pl. double vhossz (double, double, double); Header állomány szerepe. 7
Rekurzív függvény definíció A függvény törzsében önmagára hivatkozik. Pl. long fakt (long n) { if (n == 0) return 1; else return n*fakt (n-1); } Pl. fakt(5)=5*4*3*2*1*1 Végtelen egymásba ágyazás! Memória probléma! 8
Visszatérő érték: pointer Pl. int *maxcim (int *x1, int *x2) { if (*x1 > *x2) return x1; else return x2; } 9
Függvény pointerek 1. A függvények azonosítói a tömbökhöz hasonlóan címek, bár nem adatcímek, hanem önálló kódok belépési pontjai, amelyek értéket állítanak elő. Deklaráció: típus (*név) (argumentum lista); int osszeg(int a, int b) { return a+b; } main () { int (*pf) (); pf = osszeg; printf("\n%d",(*pf)(7,76)); } 10
Függvény pointerek 2. Az int (*pf)(); és az int *pf(); /*prototípus*/ /*függvény pointer deklaráció*/ és az int *pf(); /*prototípus*/ deklarációk nem egyenértékűek! 11
Függvény pointer tömbök int osszeg(int a, int b) { return a+b; } int szorzat(int a, int b) { return a*b; } main () { int (*pft[2]) (); pft[0] = osszeg; pft[1] = szorzat; printf("\n%d%d", (*pft[0])(7, 76),(*pft[1])(8, 44)); } 12
Enumerációs adattípus 1. Olyan szimbólumkészlet (nevek) használata, amelyeknek kódolása nem fontos. Két lehetőség van: egyenként: #define HAROMSZOG 1 #define NEGYSZOG 2 #define OTSZOG 3 13
Enumerációs adattípus 2. enum enum_azonosító {haromszog, negyszog, otszog}sikidom; vagy enum {pont, egyenes, szakasz} elemek; Használata: sikidom = otszog; sikidom = pont; /* illegális */ A felsorolt típusok konstansok, 0-tól sorszámozódnak, relációs operátor használható, értékadásnál típusellenőrzés (Pascal: set). 14
Enumerációs adattípus 3. Eltérő sorszámozás: enum {pont=3, egyenes=1, szakasz=-1} elem; vagy enum {jan=1, febr, marc, ... } honapok; 15