Miről lesz ma szó?
A PROGAMOZÁS ALAPJAI 1
10. előadás Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék
[email protected] 2012. április 10.
Függvény mint függvény paramétere • alaki szabályok • használata - mintapélda A union adattípus • használata - mintapélda Bitmezők • tipikus felhasználása Változók tárolása • Tárolási osztályok • Függvény lokális változói • Változók élettartama • Változók láthatósága Karbantartható programok írása. • program modulok • tesztelés • hibalehetőségek • hibakezelés, const és assert használata • dokumentáció • megjegyzések
A programozás alapjai 1 10. előadás
Függvény mint függvény paramétere Függvény paramétere függvény is lehet.
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény mint függvény paramétere Példa: Legyen egy típusunk síkbeli pontok ábrázolására!
Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át.
Két ilyen pont alkosson egy szakaszt!
Formális paraméterként a függvény fejlécét kell megadni.
Írjunk függvényt annak a pontnak a meghatározására, amely a szakaszt adott arányban osztja! oszt()
Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül !). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény mint függvény paramétere Példa: typedef struct{double x,y;}pont; double arany(double also,double felso,double c) {return also+c*(felso-also);} pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; } int main(){ pont q1,q2,q3; ... q3=oszt(q1,q2,0.4,arany); ... } A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A függvénynek legyen paramétere egy függvény, amely két érték közötti interpolációt számol! arany() Az osztópont koordinátáit ennek segítségével számítsuk ki! A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény mint függvény paramétere Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül !). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
1
Függvény mint függvény paramétere Példa: typedef struct{double x,y;}pont; double arany(double also,double felso,double c) {return also+c*(felso-also);} pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; } int main(){ pont q1,q2,q3; ... q3=oszt(q1,q2,0.4,arany); ... } A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény mint függvény paramétere Példa: typedef struct{double x,y;}pont; double arany(double also,double felso,double c) {return also+c*(felso-also);} pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; } int main(){ pont q1,q2,q3; ... q3=oszt(q1,q2,0.4,arany); ... } A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény mint függvény paramétere
Függvény mint függvény paramétere Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül !). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény mint függvény paramétere Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül !). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
Példa: typedef struct{double x,y;}pont; double arany(double also,double felso,double c) {return also+c*(felso-also);} pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; } int main(){ pont q1,q2,q3; ... q3=oszt(q1,q2,0.4,arany); ... } A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Megkülönböztetett egyesítés (diszjunkt unió) logikailag azonos értelemben használt akár különböző típusú adatokból álló egyszerű adattípus
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
2
A union adattípus
A union adattípus
Példa:
Deklarációja: Ha tejet vásárolunk, a zsírtartalom, ha kenyeret, a gabona fajtája jellemzi.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
Alakilag megegyezik a struktúráéval, csak struct helyett union kulcsszó kell.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
Példa:
Tagok elérése:
typedef enum {arpa,buza,rozs,zab} gabona; typedef enum {vizes,tejes,sos,sajtos} iz; union etel { gabona kenyer; float tej; iz kifli; } e1,*ep; A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
Alakilag megegyezik a struktúra tagokéval. Példa: e1.tej = 3.6;
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
Belső ábrázolása: A tárolás helyigényét a leghosszabb változat határozza meg.
9.c
AAAA
Balogh Buda
Rák Emil
Kiss Döme
felelet
3
témazáró
4
felelet
5
röpdolgozat 2 felelet
4
ZZZZ
témazáró
5
felelet
5
röpdolgozat 5
röpdolgozat 4 A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
3
A union adattípus
A union adattípus
9.c
9.c
Balogh Buda
AAAA
Rák Emil
Kiss Döme
felelet
3
témazáró
4
felelet
5
röpdolgozat 2 felelet
4
AAAA
ZZZZ
5
felelet
3
felelet
5
témazáró
4
felelet
5
röpdolgozat 4
0
-1
0
7.a
1
7.b
...
...
174
Balogh Buda
6
2
8.a
175
Tulok Ferdinánd
-2
3
8.b
4
9.a
6
5
9.b
...
...
190
Kiss Döme
...
...
6
203
Rák Emil
...
...
6
9.c
7
10.a
8
10.b
felelet
3 4
felelet
5
röpdolgozat 2 felelet
ZZZZ
203
190
témazáró
4
témazáró
5
felelet
5
röpdolgozat 5
röpdolgozat 4 A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
4
témazáró
5
felelet
5
röpdolgozat 5
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
typedef enum{ felelet, ropdolgozat, temazaro }jegy_tipus; typedef struct x{ jegy_tipus miert; short osztalyzat; struct x *kovetkezo_jegy; }jegy,*jegy_mutato; typedef struct y{ char nev[48]; jegy_mutato jegyek; struct y *kovetkezo_tanulo; }tanulo,*tanulo_mutato; typedef struct { char osztaly_neve[4]; tanulo_mutato tanulok; }osztaly; A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Bitmezők
typedef enum{felelet,ropdolg,dolg}jegy_tipus; typedef union z{ struct{ unsigned index; union z *jegyek; union z *kovetkezo_tanulo; }tanulo; struct{ jegy_tipus miert; short osztalyzat; union z *kovetkezo_jegy; }jegy; }diak,*diak_mutato; typedef struct { char osztaly_neve[4]; diak_mutato tanulok; }osztaly; A programozás alapjai 1 10. előadás
felelet
A union adattípus
Eöregh Elemér
...
174
röpdolgozat 2
ZZZZ
röpdolgozat 4 © Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A union adattípus
AAAA
Rák Emil
Kiss Döme
témazáró
röpdolgozat 5
A programozás alapjai 1 10. előadás
9.c
Balogh Buda
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Egy változóban valójában több (néhány bites) változót tárolunk. Elsősorban eszközök státuszregisztereinek kényelmes kezelésére találták ki. Nem kell ”kimaszkolni” a kezelni kívánt biteket. Nem kell léptetni ahhoz, hogy a változó igazi értékével dolgozhassunk. A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
4
Bitmezők
Bitmezők
Megvalósítása struktúraként!
Megvalósítása struktúraként! A tag típusaként int vagy unsigned int típust kell megadni. : után elő kell írni a bitben értendő mezőszélességet.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Bitmezők
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Bitmezők
Példa:
Megjegyzések:
struct { unsigned a : 1; unsigned b : 2; unsigned c : 1; } statusz; statusz.b = 3; statusz.a = statusz.c = 0; A programozás alapjai 1 10. előadás
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Tárolási osztályok Külső A program bármely függvényéből elérhető (a függvényeken kívül deklarált) Automatikus Csak az adott függvényen belül elérhető (a függvényen belül deklarált)
A megvalósítástól függ, hogy balról-jobbra, vagy jobbról-balra történik a bitek kiosztása. Névtelen mezők is megadhatók, de később nem hivatkozhatunk rájuk. 0 mezőszélesség megadása jelenti a mező szóhatárra illesztését, ha az adott rendszerben a szóhatár átlépése egyáltalán megengedett. A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Tárolási osztályok Statikus • Külső A többi modul elől elrejtett • Automatikus Egyetlen közösen használt példány
Példa: static int a=0; Ebben a változóban számlálhatjuk pl., hogy a függvényt hány alkalommal hívták meg a program futása során, vagy megjegyezhetjük a futás során előforduló legnagyobb számított értéket, stb.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
5
Tárolási osztályok Regiszter Regiszterben tárolandó, ha lehet • • • • •
gyakran akarunk hivatkozni rá csak, ha a belső ábrázolás lehetővé teszi csak, ha van elég regiszter figyelmeztetés nélkül figyelmen kívül hagyható változó és függvényparaméter is lehet
Példa: register int a; double d(register int b){...}
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény lokális változói A függvények lokális változói két csoportot alkotnak: - a függvény paraméterei - a függvény automatikus változói (ezeket a függvényen belül deklaráltuk) A két csoportban használt azonosítók nem ütközhetnek!
Tárolási osztályok Kezdőérték hozzárendelése a változóhoz
kezdetiérték adás kezdeti értékadás • Külső Garantáltan kinullázódik (bármit is jelentsen) Konstans kifejezés előírható • Automatikus Kezdőérték bizonytalan lehet Tetszőleges kifejezés előírható • Statikus Csak az első belépéskor hajtódik végre
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény lokális változói A függvények lokális változóit a veremben (stack) tároljuk. Az elnevezés arra utal, hogy ez egy LIFO szervezésű memória terület (Last In First Out) Eredetileg arra szolgál, hogy itt tároljuk a szubrutinok visszatérési címét, illetve adatokat átmenetileg tároljunk. Magasszintű nyelveknél általában a veremben történik: - a kifejezések kiértékelése - paraméterek átadása a függvénynek - a függvény adminisztratív információjának tárolása - helyfoglalás a függvény belső változóinak
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény lokális változói Az egy függvényhez tartozó adatokat együtt tartjuk egy szegmens mezőnek (stack frame) nevezett területen.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Függvény lokális változói A függvény lokális változóit az adminisztratív blokkhoz képest relatív címzéssel érjük el. (Ezt a báziscímet az Intel processzorokban külön erre a célra szolgáló regiszter – a bázis pointer – tárolja.)
automatikus változók adminisztratív blokk átvett paraméterek
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
6
Változók élettartama A külső változók élettartama a program teljes futási ideje. A dinamikus változók létrehozásuktól megszüntetésükig léteznek. (illetve addig hivatkozhatók, amíg mutat rájuk érvényes pointer) Azt a memória területet, ahol dinamikus változókat tárolhatunk, heap-nek nevezzük, ezért szokásos a dinamikus változókról mint „kazal”-változókról beszélni. A blokkokban deklarált változók élettartama a blokkhoz kötött (függetlenül attól, hogy a függvény blokkja, vagy azon belüli) Ezeket a változókat szokás „verem”-változóknak nevezni.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Változók láthatósága Általános szabály, hogy a fordító nem lát bele a blokkokba. Változókra csak kifejezésben hivatkozhatunk, kifejezés csak utasítás része lehet, utasítás pedig csak blokkon belül állhat. A blokkok korlátlanul egymásba skatulyázhatók. Mindezek alapján elegendő azt vizsgálnunk, hogy mely változók hivatkozhatók egy blokkon belül.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Változók láthatósága Találat esetén a fordító a megtalált változóra vonatkozónak tekinti a hivatkozást, ezért, ha a keresésben később következő helyen is van egyező azonosítójú változó, az az adott blokk utasításai számára nem látható. Azt mondjuk, hogy a blokkban deklarált változó elfedi a másikat.
Változók élettartama Az átvett paraméterek fizikailag akkor jönnek létre, amikor a hívó programrészlet az aktuális paramétereket kiértékeli, és ennek során elhelyezi a veremben. Változóként a függvény végrehajtásának kezdetétől a visszatéréséig hivatkozhatók. Fizikailag a visszatérés után a hívó programrészlet feladata, hogy a vermet felszabadítsa.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Változók láthatósága Ha a fordító a hivatkozott azonosító deklarációját a blokkon belül megtalálja, nem keres tovább. Ha nem találja meg, egy blokkal kijjebb keresi. Ha ott sincs, tovább halad kifelé, majd a függvény paraméterei következnek, azután a külső változók. Ha nem találja, azt feltételezi, hogy másik modulban van.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Változók láthatósága A blokkra nézve lokális változók: - a blokkban deklarált változók - a blokkot tartalmazó függvény paraméterei A blokkra nézve globális változók: - a blokkot magába foglaló blokkokban deklarált változók - a külső változók - a társ modulok külső változói közül a nem statikusak A globális változók közül csak az el nem fedettek hivatkozhatók.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
7
Változók láthatósága #include <stdio.h> int i; int a(int i){ return i+1; } void b(int*q){ int i; i=*q+3; *q=2*i; } int main(){ int*p; i=a(4); p=&i; { int i; for(i=0;i<3;i++) b(p); } printf("%d\n",i); return 0; } A programozás alapjai 1 10. előadás
Karbantartható programok írása Programok tesztelése: Attól, hogy helyes algoritmust választottunk, még nem biztos, hogy hibátlanul is kódoltuk. A program részleteit alulról felfelé haladva teszteljük. Csak a már tesztelt függvények működésében bízhatunk.
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
Programok tesztelése:
Programok tesztelése:
A program minden lehetséges ágát ki kell próbálni.
Ha van debugger segédprogramunk, break point-okat helyezhetünk el a programban.
A teszteléshez használt bemenő adatsor alkalmas megválasztása nem mindig egyszerű feladat. Azt, hogy a program kívánt pontjára eljutottunk-e, és ott kritikus változóink az elvárt értéket mutatják-e, két szokásos módon tudhatjuk meg. A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása Programok tesztelése:
Lehetőség van a megállást feltételhez kötni, például adott kifejezésnek egy kijelölt tartománybeli értékéhez, vagy az adott pont érintésének számának minimális vagy pontos értékéhez. A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása Programok tesztelése:
A másik szokásos eljárás a trace-elés. A program adott pontjain kiíratjuk a kritikus változók pillanatnyi értékét. Mivel erre a kódra a tesztelés végeztével nem lesz szükségünk, feltételes fordítást alkalmazunk.
A programozás alapjai 1 10. előadás
A futást átmenetileg megállítva, megvizsgálhatjuk a változók értékét.
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Példa: #define TESZT ... #ifdef TESZT printf(”A hűtés hatására a hőfok %d\n”,t); #endif
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
8
Karbantartható programok írása Programok tesztelése:
Programok tesztelése:
Ha egy vezérlési ágba túl bonyolult módon lehetne eljuttatni a programot, a többi változó érintetlenül hagyása mellett „csalhatunk” is. Erre is a feltételes fordítás teremt lehetőséget.
A programozás alapjai 1 10. előadás
Karbantartható programok írása
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
Példa: #define TESZT 8 ... #if TESZT==8 a=171; #endif switch(a){ ... case 171: ... A programozás alapjai 1 10. előadás
Karbantartható programok írása
Hibalehetőségek:
Hibalehetőségek:
Hibás adatok
Programhibák
• fájlból: az adatok szerkezete vagy alakja nem felel meg a feltételezésnek (előírásnak)
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
• tervezési hibák • kódolási hibák
• felhasználótól: téves adatokat visz be (elnézi a sort, elírja, stb.) A beolvasott adatokat mindig ellenőrizzük!
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása Hibalehetőségek:
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Tipikus programozói hibák
The last C bug of the world:
A leggyakoribb kódolási hibák == helyett =
utólagos utasítás beszúráskor { } elmardása
while (1) { status = GetRadarStatus(); if (status = 1) LaunchMissiles();
ciklus végrehajtása nem érinti a leállási feltételt
}
ritkán használt operátorok precedenciájának téves feltételezése for zárójele után ;
mutató mutatója függvény paramétereként A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
9
Karbantartható programok írása
Karbantartható programok írása
Hibalehetőségek:
Hibakezelés:
A leggyakoribb kódolási hibák
Ha futás közben kiderül, hogy valami elromlott, de nem azonosítható, hogy mi okozta a hibát, legjobb azonnal abbahagyni a végrehajtást, mielőtt a hiba továbbterjed!
túl sok átláthatatlan mellékhatás,ezért
MISS Make It Simple and Straight (Stupid)
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
Az assert makro használatával egy feltételhez kötötten kiválthatjuk a program azonnali elhalását.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
Hibamegelőzés:
Hibamegelőzés:
A C nyelvben nincs szükség konstansokra, mert ezt a szerepet a makro tölti be.
Ha ugyanazokat a header fájlokat több modul használhatja, megakadályhatjuk a bennük előforduló elemek többszöri deklarációját:
Ha azonban egy adatot a const kulcsszó segítségével állandónak minősítünk, elejét vehetjük annak, hogy véletlenül megváltoztassuk az értékét. Ezt még mutatón keresztüli indirekcióval sem lehet megtenni.
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
Például: a korábbi példánkban látott P20.h tartalma legyen: #ifndef P20_H #define P20_H void egyesit(char**,char*); #endif A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
Karbantartható programok írása
Dokumentáció:
Dokumentáció:
Ha a programunk „termék”, akkor számos vázlatot, tervet, kézikönyvet kell elkészíteni, hogy átadható legyen.
Ilyen esetben is dokumentálni kell azonban az alkalmazott adatszerkezteket.
Ha csak a karbantartás és a későbbi fejlesztések lehetővé tétele a cél, akkor minimalizálhatjuk a szükséges dokumentáció mértékét.
Ha az érthetőség megkívánja, ábrával is szemléltetni kell. Rögzíteni kell a programban megvalósított algoritmusokat (ábra és/vagy pszeudokód) A program forráskódját kommentezni kell. Részletesen jegyzőkönyvezni kell a program tesztelését (teszt adatsorok és a program válasza)
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
10
Karbantartható programok írása
Karbantartható programok írása
Kommentezés:
Kommentezés:
Minden modul fejlécében szerepelnie kell:
Minden függvény fejlécében szerepelnie kell:
• Ki fejlesztette? • Utolsó módosítás dátuma • Esetleges verziószám • Mely modulokkal működik együtt? • Ha vannak globális változók, mi a szerepük?
A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
• Mit csinál a függvény? • Az átvett paraméterek szerepe. • A belső változók szerepe A függvény törzsében olyan mértékben kell kommentezni, hogy az algoritmus lépései azonosíthatók legyenek. A programozás alapjai 1 10. előadás
© Vitéz András, Dr. Zsóka Zoltán, Híradástechnikai Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem
11