Top Banner
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
24

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

Mar 14, 2016

Download

Documents

Marcia Barker

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 #include #define MAXSOR 200 main (int argc, char *argv[]) { char sor[MAXSOR]; int talalt=0; - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 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

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

Parancssor arg. kezelés példa 1/a.keres minta

#include <stdio.h>#include <string.h>#define MAXSOR 200main (int argc, char *argv[]){ char sor[MAXSOR]; int talalt=0; if (argc != 2) printf ("Minta?\n");

else{ while (fgets(sor,MAXSOR,stdin)!=NULL)

2

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

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

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

Parancssor arg. kezelés példa 2/a.keres -x -n mintax: azt a sort írja ki,amiben nem találhatón: sorszámozás

#include <stdio.h>#include <string.h>#define MAXSOR 200main (int argc, char *argv[]){ char sor[MAXSOR]; long sorszam=0;int c,kiveve=0,szam=0,talalt=0;

4

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

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

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

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

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

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

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

Fordítóprogramok 2.-egyetlen forrásprogram,-nehézkes belövés.

2. FordítóprogramokA 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

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

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énb.) könyvtári hivatkozásoksaját objektum könyvtárakrendszerhívási felületekbetöltő modul: osztott memóriakezelés, áthelyezhető programok.

9

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

A C előfordító 1.Előfordító - preprocesszorA 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

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

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

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

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

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

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

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

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

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

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

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

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 NEVC forrás1

#elseC forrás2

#endif

vagy#ifndef NEV...

16

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

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

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

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

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

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

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

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

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

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

seged.c#include "sajat.h"

sajat.hextern int poz_x, poz_y;

21

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

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 MAINint poz_x=122, poz_y=543;#elseextern int poz_x, poz_y;#endif

22

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

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

seged.c#include "sajat.h"

23

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

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

24