1 / 24

9. előadás (2005. április 26.)

9. előadás (2005. április 26.). Parancssor argumentum kezelés példák (K&R) Fordítóprogramok A C előfordító. 1. Parancssor arg. kezelés példa 1/a. keres minta #include <stdio.h> #include <string.h> #define MAXSOR 200 main (int argc, char *argv[]) { char sor[MAXSOR]; int talalt=0;

Télécharger la présentation

9. előadás (2005. április 26.)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 9. előadás (2005. április 26.) • Parancssor argumentum kezelés példák (K&R) • Fordítóprogramok • A C előfordító 1

  2. Parancssor arg. kezelés példa 1/a. keres minta #include <stdio.h> #include <string.h> #define MAXSOR 200 main (int argc, char *argv[]) { char sor[MAXSOR]; int talalt=0; if (argc != 2) printf ("Minta?\n"); else { while (fgets(sor,MAXSOR,stdin)!=NULL) 2

  3. Parancssor kezelés példa 1/b. /*Az fgets fgv. a következő max. MAXSOR-1 karaktert beolvassa a sor-ba az új sor karakterig (azt is, '\0'). Hiba vagy áll.végnél NULL*/ if(strstr(sor,argv[1])!=NULL) /*Az strstr fgv. visszatérési értéke argv[1] sor-beli első előfordulásának kezdetét címző mutató,vagy NULL, ha nincs benne*/ { printf ("%s",sor); talalt++; } return talalt; } } 3

  4. Parancssor arg. kezelés példa 2/a. keres -x -n minta x: azt a sort írja ki,amiben nem található n: sorszámozás #include <stdio.h> #include <string.h> #define MAXSOR 200 main (int argc, char *argv[]) { char sor[MAXSOR]; long sorszam=0; int c,kiveve=0,szam=0,talalt=0; 4

  5. Parancssor arg. kezelés példa 2/b. while(--argc>0 && (*++argv)[0]=="-") /* **++argv == "-",[] a legszorosabb*/ while(c=*++argv[0]) switch(c) { case 'x': kiveve=1; break; case 'n': szam=1; break; default: printf("keres:illegal opció%c\n",c); argc=0; talalt=-1; break; } if(argc!=1) printf("keres -x -n minta \n"); 5

  6. Parancssor arg. kezelés példa 2/c. else while (fgets(sor,MAXSOR,stdin)!=NULL){ sorszam++; if((strstr(sor,*argv)!=NULL)!=kiveve){ if (szam) printf("%ld:",sorszam); printf("%s",sor); talalt++; } } return talalt; } 6

  7. Fordítóprogramok 1. Gépi utasításkészlet: bináris adatsorozat, melyet a CPU belső értelmezése szerint hajt végre. Szimbolikus gépi nyelv, assembly nyelv: utasítások, változók, gépi tárolóegységek szimbolikus névvel láthatók el. Fordítóprogramja: assembler. CPU specifikusak, nem hordozhatóak. 3 generációs programnyelvek: szabványos CPU független nyelvek. Fordítási mechanizmusok: 1. Soronkénti: interpreter -kötetlen változó deklaráció, 7

  8. Fordítóprogramok 2. -egyetlen forrásprogram, -nehézkes belövés. 2. Fordítóprogramok A fordítás lépései: - lexikális analízis: a nyelvi szimbólumok felismerése és osztályozása: konstansok, makrók, változók, függvények -> szimbólumtábla generálás, - elemzés: a nyelv formális szabályainak megfelelő struktúrák felismerése és alkalmazása - kulcsszó felismerés, 8

  9. Fordítóprogramok 3. - kódgenerálás: gépi utasítássorozat generálás az elemzés alapján - object kód. Szerkesztés a feloldatlan szimbólumok kódjának illesztése a programhoz, kétféle object kód: a.) saját önálló modul több forrásállományból álló program esetén b.) könyvtári hivatkozások saját objektum könyvtárak rendszerhívási felületek betöltő modul: osztott memóriakezelés, áthelyezhető programok. 9

  10. A C előfordító 1. Előfordító - preprocesszor A lexikális analízist megelőző fordítási menet. Feladatai: - makrófeldolgozás, - C forrásállományok beolvasása, - feltételes fordítás vezérlése. Előnyei: - könnyebb program fejlesztés, - olvashatóság javul, - módosíthatóság javul, - portabilitás javul. 10

  11. A C előfordító 2. Szintaktika: Kezdőszimbólum: # Pl. #define PI 3.14152 Hosszú sor: folytató karakter: \ Makrohelyettesítés: Minden szimbólumot a definíciójával. Hibalehetőség: #define MERET 100; int a[MERET]; A programok ne tartalmazzanak mágikus számokat! 11

  12. A C előfordító 3. Függvény típusú makró #define NEV(argumentumlista) makrótest Pl. #define csere(A,B) {int S; S=A; A=B; B=S;} Makróhelyettesítéskor nincs típusellenőrzés: float x=3.2, y=6.3; csere(x, y); /*figyelmeztető üzenet*/ Hibalehetőség: #define negyzet(X) X*X negyzet(a+b) /* a+b*a+b */ #define negyzet(X) (X)*(X) 12

  13. A C előfordító 4. Makrók vagy függvények? Előnyök: - a makrók gyorsak (fordítási időben helyettesítődik), - nincs argumentum típus ellenőrzés (többcélú makrók), - javítják a program olvashatóságát. Hátrányok: - az argumentumok annyiszor értékelődnek ki, ahányszor előfordulnak, - többszörösen fordulnak le (helyigényesebb), - nincs argumentum típus ellenőrzés, - a hibafelismerést nehezíti, 13

  14. A C előfordító 5. - mellékhatások ( pl.: i++ , mint argumentum) #define max(A,B) ((A)>(B)?(A):(B)) max(i++, j++) Beépített makrók: __LINE__ forrásfile aktuális sorának száma __FILE__ forrásfile neve __TIME__ fordítás időpontja __DATE__ fordítás dátuma __STDC__ 1, ha a fordító ANSI C Pl. printf("Prog %s:(%d)File nyitási hiba", __FILE__,__LINE__); 14

  15. A C előfordító 6. Makrónév törlése #undef NEV /* a NEV újradefiniálható */ Feltételes fordítás #if feltétel C forrás1 [#elif feltétel C forrás2] [#else C forrás3] #endif 15

  16. A C előfordító 7. A feltétel csak konstans kifejezés lehet: konstans, makrószimbólum. Makrólétezés tesztelése: #ifdef NEV C forrás1 #else C forrás2 #endif vagy #ifndef NEV ... 16

  17. A C előfordító 8. Forrásbeolvasás: beolvasás standard helyről (a Unixban általában \usr\include\), ahol az include állományok vannak: #include <filenév> beolvasás az aktuális directory-ból: #include "filenév" Makró kifejtés megnézése: cc -E prog.c vagy fájlba irányítva: cc -E prog.c > prog.pre 17

  18. A C előfordító 9. Pl. egy összetett, több forrásból álló program: main.c /* main.c */ #include "header.h" #include <stdio.h> char *astring="Üdv Mindenkinek!"; main () { printf("Fut a főprogram\n"); Writestring(SAJ_STR); printf(""Vége \n); } 18

  19. A C előfordító 10. header.h /* header.h */ #define SAJ_STR "Üdv Neked!" void Writestring (char *); writestring.c /* writestring.c */ extern char *astring; void Writestring(char *parstring) { printf("%s\n", parstring); printf("Globális változó=%s\n", astring); } 19

  20. A C előfordító 11. Általában a saját header állományokat több forrás olvassa be, ezért gyakran használjuk az extern hivatkozást. Egy globális változó azonban csak egy forrásban definiálható. 20

  21. A C előfordító 12. I. megoldás: main.c int poz_x, poz_y; #include "sajat.h" seged.c #include "sajat.h" sajat.h extern int poz_x, poz_y; 21

  22. A C előfordító 13. II. megoldás, az inicializálás miatt: main.c #define MAIN #include "sajat.h" seged.c #include "sajat.h" sajat.h #ifdef MAIN int poz_x=122, poz_y=543; #else extern int poz_x, poz_y; #endif 22

  23. A C előfordító 14. III. megoldás: main.c #define MAIN #include "sajat.h" seged.c #include "sajat.h" 23

  24. A C előfordító 15. sajat.h #ifdef MAIN #define EXTERN #else #define EXTERN extern #endif EXTERN int poz_x, poz_y; 24

More Related