10 el ad s 2004 prilis 20 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
10. előadás (2004. április 20.) PowerPoint Presentation
Download Presentation
10. előadás (2004. április 20.)

Loading in 2 Seconds...

play fullscreen
1 / 21

10. előadás (2004. április 20.) - PowerPoint PPT Presentation


  • 70 Views
  • Uploaded on

10. előadás (2004. április 20.). A C előfordító (folytatás) Néhány hasznos compiler opció Egy tanulságos könyvtári függvény Változó hosszúságú argumentum lista I/O átirányítás Véletlenszám generálás Parancs végrehajtás. 1. A C fordító működésének szemléltetése. 2. A C előfordító 16.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '10. előadás (2004. április 20.)' - adele


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
10 el ad s 2004 prilis 20
10. előadás (2004. április 20.)
  • A C előfordító (folytatás)
  • Néhány hasznos compiler opció
  • Egy tanulságos könyvtári függvény
  • Változó hosszúságú argumentum lista
  • I/O átirányítás
  • Véletlenszám generálás
  • Parancs végrehajtás

1

a c el ford t 16
A C előfordító 16.

A parancssorban is adhatunk meg makrót:

cc -DLINELENGTH=80 prog.c -o prog

Hatása a következő:

#define LINELENGTH 80

A #define vagy az #undef felülbírálja a parancssori beállításokat.

Érték nélkül is definíálhatunk szimbólumot:

cc -DDEBUG prog.c -o prog

Ekkor a default érték: 1

Pl. nyomkövetésre jól használható:

3

a c el ford t 17
A C előfordító 17.

#ifdef DEBUG

printf("Nyomkövetés: Program Verzió:1\n");

#else

printf("Program Verzió:1\n");

#endif

A program belsejében is használható:

x = y *3;

#ifdef DEBUG

printf("Nyomkövetés:változók (x,y)=\n",x,y);

#endif

4

a c el ford t 18
A C előfordító 18.

A #error fordító (compiler) hibaüzenetet generál:

#ifdef OS_MSDOS

  #include <msdos.h>

#elifdef OS_UNIX

#include "default.h"

#else

#error Nem támogatott OS!!

#endif

5

a c el ford t 19
A C előfordító 19.

Makródefinícióban használható a # stringesítő operátor (string-literal operator), pl.:

#define OUT(x) printf(#x)

Hívása:

OUT(Hello Jani!); -> printf("Hello Jani!");

A speciális karakterekre tekintettel van:

OUT("Hello Jani!"); -> printf("\"Hello Jani!\"");

Makrókifejtéskor két string egyesítésére (konkatenáció) használható a ## konkatenáció operátor (ez nem kezeli az escape karaktereket), pl.:

6

a c el ford t 20
A C előfordító 20.

#define SZECSKA(x) func##x

salata=SZECSKA(3)(q,w); ->

salata=func3(q,w); Módosult a C kód!

#include <stdio.h>

#define OUT(x) printf(#x"egyenlő%d.\n",x)

main()

{

int hossz=123; OUT(hossz); return(0);

}

printf("hossz""egyenlő%d.\n",hossz);

hossz egyenlő 123.

7

n h ny hasznos compiler opci 1
Néhány hasznos compiler opció 1.

cc program.c -> a.out

-o

cc -o program program.c -> program

-c

cc -c modul1.c modul2.c -> modul1.o, modul2.o

cc -o exefajl modul1.o modul2.o -> exefajl

-llibrary

cc -o calccalc.c -lm

(a matematikai könyvtárt explicite kell linkelni)

8

n h ny hasznos compiler opci 2
Néhány hasznos compiler opció 2.

-Ldirectory

cc prog.c -L/home/myname/mylibs mylib.a

Különben csak a/libés/usr/libhelyeken keres.

-Ipathname

Az include fájlok keresési sorrendje: a forrásfájl helye, az-I-vel megadott katalógusban és végül a/usr/include-ban, pl.:

-g

Utasítja a compiler-t kiegészítő szimbólum tábla információk készítésére a debug eszközök használatához.

9

egy tanuls gos k nyvt ri f ggv ny 1
Egy tanulságos könyvtári függvény 1.

Az stdlib.h -ban található qsort rendező függvény prototípusa:

void qsort(void *base, size_t num_elements, size_t element_size, int (*compare)(void const *, void const *));

base: a rendezendő tömbre mutat

num_elements: a tömb mérete (elemeinek száma)

element_size: a tömb elemeinek mérete byte-okban

compare: függvény mutató

A qsort azáltal adattípus független, hogy az összehasonlítást a felhasználóra bízza.

10

egy tanuls gos k nyvt ri f ggv ny 2
Egy tanulságos könyvtári függvény 2.

A compare függvény egész visszatérő értéke:<0, ha az első érték kisebb a másodiknál,=0, ha az első érték egyenlő a másodikkal,>0, ha az első érték nagyobb a másodiknál.

Pl. rendezzük a következő struktúrát egész kulcsa szerint:

typedef struct {

int key;

struct other_data;

} Record;

11

egy tanuls gos k nyvt ri f ggv ny 3
Egy tanulságos könyvtári függvény 3.

A compare függyvény definíciója:

int record_comp(void const *a,void const *b)

{

return (((Record *)a)->key -((Record *)b)->key);

}

Így aqsorthívása pl.:

qsort( array, array_length, sizeof(Record), record_comp);

12

v ltoz hossz s g argumentum lista 1
Változó hosszúságú argumentum lista 1.

Pl.: f(arg1, arg2, utarg,...)

Az <stdarg.h> headerben deklarált függvények és változók:

Az egyes argumentumokat egy va_list típusú változóval címezhetjük:

va_list ap;

A va_start makróval inicializálhatjuk az ap mutatót:

va_start (va_list ap, utarg);

A va_arg makró megadja a meg nem nevezett következő argumentumot (automatikusan lépteti ap-t):

típus va_arg (va_list ap, típus);

13

v ltoz hossz s g argumentum lista 2
Változó hosszúságú argumentum lista 2.

Az f függvényben az argumentumlista feldolgozása után, de még a visszatérés előtt meg kell hívni a va_end makrót:

void va_end (va_list ap);

Az int printf (char *formatum, ...); pédául így készült.

Egy példa (K&R):

#include <stdarg.h>

#include <stio.h>

void minprintf (char *fmt, ...)

{

va_list am;

14

v ltoz hossz s g argumentum lista 3
Változó hosszúságú argumentum lista 3.

char *p, *sert; int iert; double dert;

va_start (am, fmt);

/* am rááll az első név nélkülire*/

for (p=fmt; *p; p++){

if (*p != '%'){

putchar (*p); continue;

}

switch (*++p){

case 'd':

iert=va_arg(am, int)

/*megadja az argumentumot és léptet*/

15

v ltoz hossz s g argumentum lista 4
Változó hosszúságú argumentum lista 4.

printf ("%d", iert);

break;

case 'f':

dert= va_arg(am, double);

printf ("%f", dert);

break;

case 's':

for (sert=va_arg(am, char *); sert; sert++) putchar (*sert);

break;

default:

putchar (*p);

16

v ltoz hossz s g argumentum lista 5
Változó hosszúságú argumentum lista 5.

break;

} /*switch*/

} /*for*/

va_end (am); /*a lista feldolg. lezárása*/

} /*minprintf*/

17

i o tir ny t s 1
I/O átirányítás 1.

Bemenet:

az int getchar (void) függvény a standard bemenetről olvas egy karaktert, visszatér a beolvasott karakterrel, vagy hiba esetén EOF-fel.

prog <állományból

(nem kerül az argv-be)

pipeing mechanizmussal:

masprog | prog

(a masprog standard kimenete a prog standard bemenete)

18

i o tir ny t s 2
I/O átirányítás 2.

Kimenet:

az int putchar (int) függvény a standard kimenetre ír egy karaktert, visszatér a kiírt karakterrel, vagy hiba esetén EOF-fel.

prog >állományba

(nem kerül az argv-be)

vagy pipeing mechanizmussal:

prog | masprog

(a prog standard kimenete a masprog standard bemenete)

19

v letlensz m gener l s
Véletlenszám generálás

Az <stdlib.h> header-ben:

int rand (void);

0 <= r <= RAND_MAX

1-ről indul, min. RAND_MAX= 32767

void srand (unisgned int start);

0 <= r < 1

#define frand()((double)rand()/(RAND_MAX +1.0))

20

parancs v grehajt s
Parancs végrehajtás

Az <stdlib.h> -ban

int system (const char *s);

s az operációs rendszertől függő parancs, pl.:

system ("date");

Visszatérési értéke Unix-ban az exit visszatérési értékkel egyezik meg.

21