Egy kis ráadás...
Egy kis ráadás...¶
Miután megismertük a különböző vezérlési szerkezeteket, az előző fejezetekben azt láthattuk, milyen adattípusokkal rendelkezik a C nyelv, és hogyan tudunk mi magunk is saját típusokat létrehozni.
Sokszor azonban egyéb dolgok is kellhetnek, amik segítik egy program futását, amikkel azok működése, működtetése kényelmesebbé tehető, illetve amiknek ismerete elengethetetlen akkor, amikor programozunk egy adott nyelven. Ezeket próbáljuk összeszedni ebben a fejezetben.
Műveletek precedenciája¶
Számos műveletet megismertünk az eddigiek során. Bár a legtöbbször el is hangzott, azért nem árt, ha összegzésképp megnézzük, hogy ezek a műveletek hogyan viszonyulnak egymáshoz.
A műveletek precedenciája, illetve feldolgozási iránya (asszociativitása) megadja, hogy egy kifejezésen belül a műveletek kiértékelésének mi lesz a helyes sorrendje. Nyilván ezeknek az ismerete sokszor nélkülözhetetlen annak érdekében, hogy a kódunk valóban azt a tevékenységet végezze, ami a szándékunk volt.
A tanult műveleteket, kiértékelési irányukat és precedenciájukat az alábbi táblázatban foglaljuk össze:
Műveletek | Asszociativitás | C operátor |
---|---|---|
egyoperandusú postfix elemkiválasztás mezőkiválasztás függvényhívás |
\(\rightarrow\) | x++ , x-- [] . , -> f() |
egyoperandusú prefix méret típuskényszerítés |
\(\leftarrow\) | + , - , ++x ,--x , ! ,~ , & ,* sizeof (type) |
multiplikatív | \(\rightarrow\) | * ,/ , % |
additív | \(\rightarrow\) | + ,- |
bitléptetés | \(\rightarrow\) | << ,>> |
kisebb-nagyobb relációs | \(\rightarrow\) | <= , >= , < ,> |
egyenlő-nem egyenlő relációs | \(\rightarrow\) | == , != |
bitenkénti 'és' | \(\rightarrow\) | & |
bitenkénti 'kizáró vagy' | \(\rightarrow\) | ^ |
bitenkénti 'vagy' | \(\rightarrow\) | | |
logikai 'és' | \(\rightarrow\) | && |
logikai 'vagy' | \(\rightarrow\) | || |
feltételes | \(\leftarrow\) | ?: |
értékadó | \(\leftarrow\) | = , += , -= , *= , /= , %= , >>= , <<= , &= ,&= ,^= ,|= , |
szekvencia | \(\rightarrow\) | , |
Parancssori argumentumok¶
A C nyelvet támogató környezetekben lehetőség van arra, hogy a végrehajtás megkezdésekor a programnak parancssori argumentumokat vagy paramétereket adjunk át.
Ez sokszor megkönnyítheti a program kezelését, főleg akkor, ha a parancssorban minden olyan információt át tudunk adni, amit korábban csak a felhasználó által való interakció által tudom meg a program.
Amikor az operációs rendszer elindítja a programot, azaz meghívja a main
függvényt, a hívásban két argumentum szerepelhet:
- Az első (általában
argc
névre hallgat) azoknak a parancssori argumentumoknak a darabszáma, amelyekkel a programot meghívtuk. - A második argumentum (általában
argv
) egy mutató egy sztring tömbre, amely a parancssori argumentumokat tartalmazza. Egy karakterlánc egy argumentumnak felel meg.- Megállapodás szerint C-ben az
argv[0]
az a név, amellyel a programot hívták, így azargc
értéke legalább 1. - Számíthatunk arra is, hogy
argv[argc]==NULL
- Megállapodás szerint C-ben az
- Mivel az
argv
egy mutatótömböt megcímző mutató, amain
függvényt többféleképpen deklarálhatjuk.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Elmentve a fenti programot arg.c néven, fordítsuk le és futtassuk a következő módon:
Kimenet
$ gcc -o arg arg.c
$ ./arg alma korte szilva barack palinka
argc = 6
argv[0]: ./arg
argv[1]: alma
argv[2]: korte
argv[3]: szilva
argv[4]: barack
argv[5]: palinka
Példa: Függvény határozott integráljának kiszámítása parancssori argumentumokkal¶
- Problémafelvetés:
- Adott függvény határozott integrálját közelítsük egy beolvasott intervallumon a felhasználó által megadott számú részre osztva az intervallumot!
- Specifikáció:
- A probléma inputja az integrálandó függvény neve, \(a\), \(b\) valós számok, az intervallum végpontjai, \(n\), a közelítéshez használandó részek száma.
- Az inputot a parancssorból vegye a program.
- Az output három valós szám: a megadott függvény értéke \(a\) és \(b\) pontokban, valamint a határozott integrál értéke.
- Ha az argumentumok száma nem megfelelő, akkor hibaüzenetet írunk ki.
- A függvény neve lehet az, hogy help, és ekkor csak tájékoztató szöveg jelenik meg a választható függvények nevéről.
- Algoritmustervezés:
- A probléma inputja az integrálandó függvény neve, \(a\), \(b\) valós számok, az intervallum végpontjai, \(n\), a közelítéshez használandó részek száma.
- Az inputot a parancssorból vegye a program.
- Az output három valós szám: a megadott függvény értéke \(a\) és \(b\) pontokban, valamint a határozott integrál értéke.
- Ha az argumentumok száma nem megfelelő, akkor hibaüzenetet írunk ki.
- A függvény neve lehet az, hogy
help
, és ekkor csak tájékoztató szöveg jelenik meg a választható függvények nevéről.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
|
A program elején definiálunk egy tablaelem_t
típust.
Ez egy olyan struktúrát fog definiálni, ahol egy adott sztringet rendelünk majd egy adott függvényhez.
Ez a táblázat köti össze a felhasználó által megjelölt függvényeket azok tényleges megvalósításával.
Figyeljük meg, hogy a tablaelem_t
típusban a függvény pointer paraméter listája üres.
A későbbiekben látjuk, hogy ez azért kell, mert így a későbbiekben tetszőleges paraméterlistával ellátott függvény címe átadható ezen keresztül.
Ahhoz, hogy ez a táblázat könnyen bővíthető legyen, a méretét külön nem adjuk meg, ehelyett úgy definiáljuk, hogy utolsó értékében az aktuális táblaelem úgy van definiálva, hogy annak mindkét mezője NULL
értékkel rendelkezik.
A program használata során a felhasználó megadja a program parancssorában annak a függvénynek a nevét, aminek az integrálját akarja meghatározni. Illetve megadja a szükséges egyéb paramétereket.
Függvények közül csak olyan függvényt adhat meg, amelyet a tablazat
definiál.
Ezek olyan matematikai függvények (double
paraméterrel és visszatérési értékkel), amelyeket definál a math.h
, de akár mi magunk is definiálhatunk.
Illetve van egy bónusz függvény, a help
, ami szintén eleme a táblázatnak.
Ha a felhasználó ezt választja, nem számítódik integrál, akkor csak egy tájékoztató üzenettel tér vissza a program.
Nézzük is meg egy kicsit részletesebben ezt a help
függvényt.
A feladata annyi, hogy a tablazat
elemeit végigjárja, és kiírja azon függvények nevét, amelyeket a felhasználó a parancssorban megadhat. Ehhez paraméterében ő az első táblaelemre mutató pointert kapja meg.
Egy egyszerű ciklussal bejárva a táblázatot pedig információt ad a hívható függvényekről.
A függvény utolsó utasítása az exit
függvény meghívása, amellyel a program végrehajtása befejeződik.
A paraméterében az EXIT_SUCCCESS
flag által azt az üzenetet kapja az operációs rendszer, hogy a program normálisan fejeződött be.
Láthatjuk később a main
függvényben, hogy amikor nem megfelelő paraméterekkel, illetve paraméter számmal hívja a felhasználó a programot, a hibaüzenet az EXIT_FAILURE
.
Bizonyos hibákra adott hibakód létezik. Érdemes ezeket megfelelően beállítani, egyes esetekben ezek az értékek segíthetik a program helyes használatát.