Professional Documents
Culture Documents
A C Nyelv Függvényei
A C Nyelv Függvényei
A C nyelv függvényei
A C nyelv függvényei megfelelnek a Pascal eljárásainak vagy függvényeinek. A függvény kényelmes
lehetőséget biztosít a programozónak, hogy egy számítási részt önállóan kezelhető, zárt egységbe
foglaljon. Ezek a zárt egységek ezután szabadon felhasználhatók anélkül, hogy a konkrét
felépítésükkel, megvalósításukkal törődnünk kellene. Megfelelően tervezett és megvalósított
függvények esetén teljesen figyelmen kívül hagyhatjuk, hogy hogyan keletkezett a függvény értéke,
elegendő csak az eredményt tudni.
#include <stdio.h>
return 0;
}
/* a power(m,n) fv. az m alapot az n-edik hatványra emeli, ahol n>=0 */
int power(int alap, int n)
{
int i,p;
p=1;
for (i=1;i<=n;++i)
p=p*alap;
return p;
}
A main a power függvényt kétszer hívja meg. Mindkétszer két argumentumot adunk át a power
függvénynek és az egy egész értékkel tér vissza. Egy aritmetikai kifejezésben a power(2,i) éppolyan egész
mennyiség mint 2 és i.
A power függvény első sora az
Az
deklaráció a main előtt azt mondja meg, hogy a power függvény két egész típusú argumentumot vár és egész
típusú eredménnyel tér vissza. Ezt a deklarációt a függvényprototípusnak nevezzük, és meg kell hogy egyezzen a
függvény definíciójával és használatával. Természetesen a paraméterek neveinek nem kell egyezni, a függvény
prototípusában a paraméternevek opcionálisak. A power prototípusát így is írhatnánk:
A C nyelv sajátossága, hogy minden függvényargumentumot érték szerint adunk át. Ez azt jelenti, hogy a hívott
függvény mindig az argumentumok értékét kapja meg (átmeneti változókban), azok címe helyett. Tehát a C
nyelvben a hívott program nem férhet hozzá és nem változtathatja meg a hívó függvény változóit, csak a saját
átmeneti másolatával dolgozhat.
Az érték szerinti hívás mindenképpen előny. Felhasználásával sokkal tömörebb, kevesebb segédváltozót
tartalmazó program írható, mivel a hívott függvényben a paraméterek ugyanúgy kezelhetők, mint az inicializált
lokális változók.
Szükség esetén természetesen elérhető, hogy a hívott függvény megváltoztassa a hívó függvény valamelyik
változóját. Ehhez a hívott függvénynek meg kell kapnia a kérdéses változó címét a hívó függvénytől (ami a
változót megcímző mutató átadásával lehetséges) és a hívott függvényben a paramétert mutatóként kell
deklarálni, amelyen keresztül indirekten érhető el a hívó függvény változója.
A leírtak nem érvényesek a tömbökre. Ha argumentumként egy tömb nevét adjuk meg, akkor a függvénynek
átadott érték a tömb kezdetének helye (címe) lesz, a tömbelemek átmásolása nem történik meg.
A nem egész értékkel visszatérő függvények kezelése külön odafigyelést igényel. Tegyük fel hogy van egy
main()
{
…
double x, atof(char []);
…
x=atof(s);
…
}
A
double x, atof(char []);
deklaráció azt mondja ki, hogy az x egy double típusú változó, valamint az atof függvénynek egyetlen,
char[] típusú argumentuma van és visszatérési értéke double típusú.
A függvényt tehát következetesen, egymással összhangban kell deklarálni és definiálni. Ha egyetlen
forrásállományon belül ellentmondás van a függvény típusa és a hívásának típusa között, akkor ezt a hibát a
fordítóprogram jelezni fogja. De ha pl. az atof függvényt önállóan fordítjuk le (és ez legtöbbször így van),
akkor a hiba nem derül ki. Az atof visszaad valamilyen double értéket, amit a hívó int-ként kezel és ez
értelmetlen eredményhez vezet.
A típusillesztési hiba főként olyankor fordul elő, ha nincs függvényprototípus, és a függvény a kifejezés első
előfordulásakor, implicit módon van deklarálva. Ha korábban még nem deklarált név fordul elő egy kifejezésben
és a nevet bal oldali kerek zárójel követi, akkor arról a rendszer feltételezi, hogy függvény és a kifejezés
megfelelő részét a függvény deklarációjának tekinti.
A typedef utasítás
A C nyelv typedef utasításával új adattípus-neveket hozhatunk létre. Pl. a