Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní.

Podobné prezentace


Prezentace na téma: "Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní."— Transkript prezentace:

1 Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní parametrů hodnotou Oblast platnosti a paměťové třídy Oddělený překlad Speciální direktivy preprocesoru Typové modifikátory Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní parametrů hodnotou Oblast platnosti a paměťové třídy Oddělený překlad Speciální direktivy preprocesoru Typové modifikátory

2 Princip preprocesoringu /* vlo ž ení soubor ů */ #include /*systém*/ #include "makra.h" /*vlastní*/ void main(){ /* vlo ž ení souboru */ #include "deklarace.c" /* vyu ž ití konstant */ a = KONSTA; b = KONSTB; /* volání makra */ printf("%d", VETSI(a,b)); } /* vlo ž ení soubor ů */ #include /*systém*/ #include "makra.h" /*vlastní*/ void main(){ /* vlo ž ení souboru */ #include "deklarace.c" /* vyu ž ití konstant */ a = KONSTA; b = KONSTB; /* volání makra */ printf("%d", VETSI(a,b)); } /* definice konstant */ #define KONSTA 10 #define KONSTB 20 /* definice makra */ #define VETSI(x,y)\ ((x)>(y))?(x):(y) /* definice konstant */ #define KONSTA 10 #define KONSTB 20 /* definice makra */ #define VETSI(x,y)\ ((x)>(y))?(x):(y) int a, b; Preprocesor … int printf(const char *,...); … void main(){ int a, b; a = 10; b = 20; printf("%d", ((a)>(b))?(a):(b)); } … int printf(const char *,...); … void main(){ int a, b; a = 10; b = 20; printf("%d", ((a)>(b))?(a):(b)); } makra.h hlavni.c stdio.h math.h deklarace.c string.h memory.h math.h …

3 Direktivy preprocesoru … void main(){ unsigned int a, b; a = pow((double)27,1./3); b = pow((double)9*3,1./1+2); printf("a=%d,b=%d\n",a,b); if (1 <= (a) && (a) <= 10) printf("JMENO %d", 1990); } … void main(){ unsigned int a, b; a = pow((double)27,1./3); b = pow((double)9*3,1./1+2); printf("a=%d,b=%d\n",a,b); if (1 <= (a) && (a) <= 10) printf("JMENO %d", 1990); } #include #define ODMOCNINAN(x,n)\ pow((double)x,1./n) void main(){ UINT a, b; a = ODMOCNINAN(27,3); b = ODMOCNINAN(9*3,1+2); printf("a=%d,b=%d\n",a,b); if INTERVAL(a,1,10) printf("JMENO %d", ROK); } #include #define ODMOCNINAN(x,n)\ pow((double)x,1./n) void main(){ UINT a, b; a = ODMOCNINAN(27,3); b = ODMOCNINAN(9*3,1+2); printf("a=%d,b=%d\n",a,b); if INTERVAL(a,1,10) printf("JMENO %d", ROK); } Vkládaní souborů #include #include ".\\cesta\\muj.h" Definice maker bez parametrů #define ROK 1990 #define JMENO "Petr" #define UINT unsigned int Definice maker s parametry #define MINNULA(x)\ ((x)<0)? 0 :(x) #define ODMOCNINAN(x,n)\ pow((double)(x),1./(n)) #define INTERVAL(x,OD,DO)\ (OD <= (x) && (x) <= DO) #undef ODMOCNINAN

4 Podmíněný překlad Direktivy pro podmíněný překlad #define, #if, #else, #error … #define, #ifdef, #ifndef,… Direktivy pro podmíněný překlad #define, #if, #else, #error … #define, #ifdef, #ifndef,… #define JAZYK 1 #if JAZYK == 1 #define NAZEV "Muj Obchod" #elif JAZYK == 2 #define NAZEV "My Shop" #else #error JAZYK není nastaven #endif #define JAZYK 1 #if JAZYK == 1 #define NAZEV "Muj Obchod" #elif JAZYK == 2 #define NAZEV "My Shop" #else #error JAZYK není nastaven #endif #include void main() { printf(NAZEV); } … void main() { printf("Muj Obchod"); } #ifndef _ZNAKY_ #define _ZNAKY_ #define MAL(Z) ((Z)>='a'&&(Z)<='z') #define VEL(Z) ((Z)>='A'&&(Z)<='Z') #define POS ('a'-'A') #define NAVEL(Z) (MAL(Z))?(Z-POS):Z #define NAMAL(Z) (VEL(Z))?(Z+POS):Z #endif #ifndef _ZNAKY_ #define _ZNAKY_ #define MAL(Z) ((Z)>='a'&&(Z)<='z') #define VEL(Z) ((Z)>='A'&&(Z)<='Z') #define POS ('a'-'A') #define NAVEL(Z) (MAL(Z))?(Z-POS):Z #define NAMAL(Z) (VEL(Z))?(Z+POS):Z #endif znaky.h #include #include "znaky.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) putchar(NAVEL(zn)); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } #include #include "znaky.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) putchar(NAVEL(zn)); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } hlavni.c #define _DEF_ … #ifdef _DEF_ … #ifndef _DEF_ … #include "znaky.h" #define PISMALYZNAK(znak)\ putchar(NAMAL(znak)) #include "znaky.h" #define PISMALYZNAK(znak)\ putchar(NAMAL(znak)) mujio.h #include #include "znaky.h" #include "mujio.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) PISMALYZNAK(zn); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } #include #include "znaky.h" #include "mujio.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) PISMALYZNAK(zn); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } hlavni.c

5 Základy tvorby funkcí #include int secti(int, int); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ return a+b; } rtyp jméno( [typ par1] [,typ par2] [,…] ) { … return [(rtyp)hodnota]; } rtyp jméno( [typ par1] [,typ par2] [,…] ) { … return [(rtyp)hodnota]; } Definice void funkceA(int parametr){ … } long funkceB(int parametr){ long hodnota; … return hodnota; } int funkceC(){ int hodnota; … return hodnota; } [rtyp prom;] [prom =] jméno([pr1][,pr2][,…]); [rtyp prom;] [prom =] jméno([pr1][,pr2][,…]); Deklarace void funkceA(int parametr); long funkceB(int); int funkceC();

6 int secti(int a, int b); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ int ret = a + b; return ret; } Zjednodušený popis principu předávaní parametrů hodnotou … ?? 7 7 ?? (v) 7 (cislo) ?? 0x0123 10 0x0123 (adr) ?? (return) 10 (par. a) 7 (par. b) 10 717 (ret) 17 (return) 17 (v) 17 (return) 17 (v) int secti(int a, int b); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ int ret = a + b; return ret; } … Zásobník 0x0000 0xFFFF

7 Rekurzivní funkce #include double faktorial( int cislo) { if (cislo == 1 || cislo == 0) return 1; else return cislo * faktorial(--cislo); /*rekurze*/ } void main(){ int cislo; double f = 0; printf("Faktorial\n==========\n"); printf("Zadej cislo: "); scanf("%d",&cislo); printf("%d! = %.0lf\n(%G)\n", cislo,f,f = faktorial(cislo)); } #include double faktorial( int cislo) { if (cislo == 1 || cislo == 0) return 1; else return cislo * faktorial(--cislo); /*rekurze*/ } void main(){ int cislo; double f = 0; printf("Faktorial\n==========\n"); printf("Zadej cislo: "); scanf("%d",&cislo); printf("%d! = %.0lf\n(%G)\n", cislo,f,f = faktorial(cislo)); }

8 extern & static Globální Lokální Oblast platnosti a paměťové třídy auto static register auto static register Globální & Lokální int global; void funkce(){ int lokal = 11; global = 22; } void main(){ int v; funkce(); v = lokal * 2; v = global * 2; printf("%d",v); } auto & static & register int funkce(){ static int a = 1; auto int b = 1; a++,b++; return a*b; } void main(){ register int i,v; for(i=1;i<5;i++){ v = funkce(); printf("%d ",v); }} extern static extern static extern int gbA; static int gbB; int fc(){ gbA++; gbB++; return gbA+gbB; } int gbA; int fc(); static int gbB; void main(){ gbA = 10; gbB = 20; printf("%d",fc()); } Hlavni.c Funkce.c

9 Typové modifikátory void fc(const char *text, int n){ const int pocet = n*3; printf("%d. %s", pocet, text); } void main() { const unsigned char ne = 3; const double e = 2.7182818; int pole[ne]; fc("Dnes je p ř ednáška",1); ne = 6; } void fc(const char *text, int n){ const int pocet = n*3; printf("%d. %s", pocet, text); } void main() { const unsigned char ne = 3; const double e = 2.7182818; int pole[ne]; fc("Dnes je p ř ednáška",1); ne = 6; } const volatile char hodnota; void irq(){ hodnota++; } void main(){ … if(hodnota < 1) sleep(100); … } volatile char hodnota; void irq(){ hodnota++; } void main(){ … if(hodnota < 1) sleep(100); … } volatile

10 Oddělený překlad int fca(int a) { return 2*a; } #include "FnA.c" #include "FnB.c" void main(){ int a = fca(10); int b = fcb(20); } Hlavni.c FnA.c int fcb(int b) { return b/2; } FnB.c Hlavni.obj int fca(int a) { return 2*a; } #include "FnA.h" #include "FnB.h" void main(){ int a = fca(10); int b = fcb(20); } FnA.c int fcb(int b) { return b/2; } FnB.c Hlavni.objFnA.objFnB.obj int fca(int); FnA.h int fcb(int); FnB.h Hlavni.c

11 Speciální direktivy preprocesoru #define TISKTEXT(T)\ printf("%s",#T) #define PROM(C) prom##C #define CHYBA(T) \ {printf( "CHYBA \t\"%s\"\n" \ "\tRadek %d\n" \ "\tSoubor(%s)\n", \ T, __LINE__, __FILE__ );} void main(){ int PROM(A) = 1, PROM(B) = 2; TISKTEXT(ahoj jak se mas); printf("%d\n",promA); printf("%d\n",PROM(B)); CHYBA("Soubor nebyl nalezen"); } void main(){ int PROM(A) = 1, PROM(B) = 2; TISKTEXT(ahoj jak se mas); printf("%d\n",promA); printf("%d\n",PROM(B)); CHYBA("Soubor nebyl nalezen"); } #line 151 "soubor.c" __LINE__ __FILE__ __DATE__ __TIME__ #pragma … # ##

12 Příklad #ifndef _KVADRO_ #define _KVADRO_ #define REALRESULT 1 #define IMGRESULT 2 int kvadro( double, double, double ); extern double rex1,rex2,imx1,imx2; #endif #ifndef _KVADRO_ #define _KVADRO_ #define REALRESULT 1 #define IMGRESULT 2 int kvadro( double, double, double ); extern double rex1,rex2,imx1,imx2; #endif funkce.h #include #include " funkce.h " int kvadro( double a, double b, double c){ double D = b*b - 4*a*c; if (D<0.){ rex2 = rex1 = -b/(2*a); imx2 = -(imx1=sqrt(fabs(D))/(2*a)); return IMGRESULT; } else { rex1 = (-b + sqrt(D))/(2*a); rex2 = (-b - sqrt(D))/(2*a); return REALRESULT;}} #include #include " funkce.h " int kvadro( double a, double b, double c){ double D = b*b - 4*a*c; if (D<0.){ rex2 = rex1 = -b/(2*a); imx2 = -(imx1=sqrt(fabs(D))/(2*a)); return IMGRESULT; } else { rex1 = (-b + sqrt(D))/(2*a); rex2 = (-b - sqrt(D))/(2*a); return REALRESULT;}} funkce.c #include #include " funkce.h " double rex1,rex2,imx1,imx2; void main(){ double a,b,c; printf("Kvadraticka rovnice\n" "===================\n"); printf("Zadej koeficienty a, b, c:"); scanf("%lf,%lf,%lf",&a,&b,&c); switch (kvadro(a,b,c)){ case REALRESULT: printf("x1 = %8.2lf\n",rex1); printf("x2 = %8.2lf\n",rex2); break ; case IMGRESULT: printf("x1=%.2f%+.2fj\n",rex1,imx1); printf("x2=%.2f%+.2fj\n",rex2,imx2); break ; } #include #include " funkce.h " double rex1,rex2,imx1,imx2; void main(){ double a,b,c; printf("Kvadraticka rovnice\n" "===================\n"); printf("Zadej koeficienty a, b, c:"); scanf("%lf,%lf,%lf",&a,&b,&c); switch (kvadro(a,b,c)){ case REALRESULT: printf("x1 = %8.2lf\n",rex1); printf("x2 = %8.2lf\n",rex2); break ; case IMGRESULT: printf("x1=%.2f%+.2fj\n",rex1,imx1); printf("x2=%.2f%+.2fj\n",rex2,imx2); break ; } hlavni.c


Stáhnout ppt "Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní."

Podobné prezentace


Reklamy Google