Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Hasonló dokumentumok
Programozás 6. Dr. Iványi Péter

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Programozás 5. Dr. Iványi Péter

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

8. gyakorlat Pointerek, dinamikus memóriakezelés

Dinamikus memóriakezelés Fájlkezelés

7. gyakorlat Sorozatok, Fájlkezelés

1. Alapok. Programozás II

Programozás II. Fájlkezelés

Programozas 1. Strukturak, mutatok

Szövegek C++ -ban, a string osztály

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Programozás alapjai 9.Gy: Struktúra 2.

Programozás alapjai 6. előadás. Wagner György Általános Informatikai Tanszék

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

Mutatók és mutató-aritmetika C-ben március 19.

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás alapjai C nyelv 11. gyakorlat. Preprocesszor. Makrók (#define)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Preprocesszor. Programozás alapjai C nyelv 11. gyakorlat. Makrók (2) Makrók (#define) Makrók (3) #include

C string műveletek (string.h alkalmazása)

A C programozási nyelv III. Pointerek és tömbök.

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Példák tematikus csoportosításban

A C programozási nyelv III. Pointerek és tömbök.

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

5. Gyakorlat. struct diak {

Programozás C++ -ban

Programozás II. 4. Dr. Iványi Péter

Pénzügyi algoritmusok

Pénzügyi algoritmusok

Programozás II. 2. Dr. Iványi Péter

10. gyakorlat. Pointerek Tárolási osztályok

Programozás I. 5. Előadás: Függvények

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Programozás alapjai. 10. előadás

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

10. gyakorlat Tömb, mint függvény argumentum

Programozás I gyakorlat

OOP #14 (referencia-elv)

Pénzügyi algoritmusok

Információs Technológia

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

7. gyakorlat. Fájlkezelés IO haladó Függvények haladó

Adatbázisrendszerek I. File-szintű adattárolás C-ben. 1. gyakorlat

Programozás I. gyakorlat

Programozás I gyakorlat. 10. Stringek, mutatók

Adatbázisrendszerek I. Fájlszintű adattárolás C-ben

Programozás II. segédlet

Programozás C++ -ban

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Programozás C és C++ -ban

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

Programozási Nyelvek: C++

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Mintavételes szabályozás mikrovezérlő segítségével

Operációs rendszerek. 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor)

Programozás I gyakorlat

Programozás I gyakorlat

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

A programozás alapjai 1 Rekurzió

Bevezetés a C++ programozási nyelvbe

Programozás alapjai C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

3. Osztályok II. Programozás II

Listák, szótárak, fájlok Listák, szótárak, fájlok

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Cekla. Készítette Doxygen Tue Sep :13:44

5. gyakorlat. Konstansok Tömbök Stringek

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Rekurzió. Programozás alapjai C nyelv 9. gyakorlat. Rekurzív algoritmus. Rekurzív algoritmus fajtái. Példa: n! (2) Példa: n!

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Országzászlók (2015. május 27., Sz14)

Példatár a Programozás 1 tárgyhoz

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Programozás alapjai 1. (BMEVIEEA100)

Átírás:

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1 Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék vitez@hit.bme.hu Dinamikus memóriakezelés Dinamikus tömbök Dinamikus stringek Program kapcsolata a külvilággal. a main() függvény parméterezése, visszatérési értéke adatállományok, fájlkezelő függvények 2012. március 20. Mikor használjuk? Ha nem tudjuk előre (fordítási időben), hogy - egy változóra szükségünk lesz-e - mekkora adatvektorra lesz szükségünk - milyen struktúrájú adatszerkezetre lesz szükségünk Ha egy változóra csak a futási idő egy részében lesz szükségünk, de ez nem köthető egy függvényhez Hogyan használjuk? Helyet kell foglalni az újonnan létrehozandó változónak A memóriát az operációs rendszertől kell kérnünk Ha a kérés teljesíthető, a lefoglalt terület címét kapjuk vissza, amit egy alkalmas mutató típusú változóba töltünk A mutatón keresztül a területet változóként használhatjuk Ha már nincs rá szükség, a területet visszaadjuk Nem kell, hogy mindvégig ugyanaz a mutató mutasson rá, de legalább egy mutatónak rá kell mutatnia, mert ha nem, többé már nem tudjuk elérni (memória szivárgás) Ha már visszaadtuk, de még van mutató, amelyik mutat rá, azon át már nem szabad hivatkozni rá (fityegő hivatkozás) Adott méretű helyet foglal: void* malloc( size_t size ); a=malloc(sizeof(int)); *a=9; Adott méretű helyet foglal: void* malloc( size_t size ); 0, ha nincs elég memória A lefoglalt terület inicializálatlan! malloc(0) megengedett casting szükséges lehet 1

Adott darabszámú változónak foglal helyet, és a lefoglalt területet nullával tölti fel: void* calloc( size_t num, size_t size ); a=calloc(1,sizeof(int)); *a=9; Adott darabszámú változónak foglal helyet, és a lefoglalt területet nullával tölti fel: void* calloc( size_t num, size_t size ); a malloc() függvényt hívja meg 0, ha nincs elég memória calloc(0) megengedett casting szükséges lehet Ezt láttuk a gyakorlaton: typedef struct{double x,y;pont; pont felezo(pont a,pont b){ pont c; c.x=(a.x+b.x)/2; c.y=(a.y+b.y)/2; return c; Struktúrát ad vissza. Lehetne így is csinálni: typedef struct{double x,y;pont; pont*felezo(pont a,pont b){ pont*c; c=malloc(sizeof(pont)); c->x=(a.x+b.x)/2; c->y=(a.y+b.y)/2; return c; Dinamikus adat címét adja vissza. Dinamikus tömbök Így nem szabad csinálni: typedef struct{double x,y;pont; pont*felezo(pont a,pont b){ pont c; c.x=(a.x+b.x)/2; c.y=(a.y+b.y)/2; return &c; tömbnek: void* malloc( size_t size ); a=malloc(6*sizeof(int)); a[4]=9; Már nem létező adat érvénytelen címét adja vissza! 2

Dinamikus tömbök tömbnek: void* calloc( size_t num, size_t size ); Lefoglalt terület felszabadítása: void free( void* memblock ); a=calloc(6,sizeof(int)); a[4]=9; A terület méretét nem kell megadni free(0) megengedett Téves hívás nem okoz hibajelzést! Működése: a korábban lefoglalt terület méretét a megadott új méretre módosítja Működése: az eredeti információt megőrzi (az új méret erejéig) visszatérési érték az új terület címe ha szükséges, átmásolja a többlet területet nem inicializálja 0, ha nincs elég memória, de az eredeti terület megmarad int*q; q=malloc(3*sizeof(int)); q[0]=3; q[1]=5; q[2]=7; q=realloc(q,5*sizeof(int)); q[3]=6; q[4]=4; Az eredeti méretre nincs szükség, mert a kiadott terület elé felírja. Ezért nem szabad a lefoglalt területnek nem az elejét jelző pointerre free()-t hívni! 3

ha az első paraméter 0, mintha malloc() hívása lenne : realloc(0,4*sizeof(double)); malloc(4*sizeof(double)); ha a második paraméter 0, mintha free() hívása lenne : a=calloc(6,sizeof(int)); realloc(a,0); free(a); String műveleteknél gyakran nem tudjuk előre a méretet: Egyesítsünk két stringet! Van könyvtári függvény, ami hozzáfűz, de mi egyesíteni szeretnénk Megoldás: kiszámítjuk a tárolási igényt helyet foglalunk az egyesített stringnek egymás után másoljuk a két kapott stringet visszaadjuk az új stringre mutató pointert Dinamikus stringek #include <> #include <stdlib.h> #include <string.h> char*egyesit (char*a,char*b){ int i,j; char*s; i=strlen(a); j=strlen(b); s=malloc(i+j+1); strcpy(s,a); strcpy(s+i,b); return s; KI: Dinamikus stringek lódarázs varázsló int main(){ char s1[]="ló",s2[]="darázs"; char *s3,*s4; s3=egyesit(s1,s2); s4=egyesit(s2,s1); s4[0]='v'; printf("%s\n",s3); printf("%s\n",s4); return 0; Miért lehet rá szükségünk: Nem tudjuk előre (fordítási időben) a tömb méreteit A fordító nem tudja kalkulálni az elemek címét Ugyanúgy szeretnénk használni, ahogy megszoktuk typedef... tombelem; létrehozása: tombelem**tomb2d(int n,int m){ tombelem*t,**p; int i; t=malloc(n*m*sizeof(tombelem)); p=malloc(n*sizeof(tombelem*)); for(i=0;i<n;i++) p[i]=t+m*i; return p; 4

Függvény belső változói t: p: A függvény visszatérésekor a kapott címet egy változóba kell töltenünk. megszüntetése: void lebont2d(tombelem**p){ free(p[0]); free(p); typedef double tombelem; használata: int i,j,s,o; tombelem**a; scanf("%d%d",&s,&o); a=tomb2d(s,o); for(i=0;i<s;i++)for(j=0;j<o;j++) a[i][j]=i+1+0.1*(j+1); for(i=0;i<s;i++){ for(j=0;j<o;j++)printf("%5.1lf",a[i][j]); printf("\n"); lebont2d(a); A program kapcsolata a külvilággal A main() függvény paraméterezése BE: 4 7 KI: 1.1 1.2 1.3 1.4 1.5 1.6 1.7 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.1 3.2 3.3 3.4 3.5 3.6 3.7 4.1 4.2 4.3 4.4 4.5 4.6 4.7 int main(int argc, char *argv[]) {... 5

A program kapcsolata a külvilággal A main() függvény paraméterezése c:\c\pelda> ezaprog 1.param -második /harmadik utolsó argc=5 argv[0] c:\c\pelda\ezaprog.exe argv[1] 1.param argv[2] -második argv[3] /harmadik argv[4] utolsó argv[5]=0 Program indítását az operációs rendszertől kérhetjük: parancssorból másik futó programból A futás sikerétől függően más programok indítása válhat szükségessé feleslegessé A visszatérési értéket hibakódként értelmezzük: 0 jelenti, hogy minden rendben volt bármely más érték megegyezés kérdése A program kapcsolata a külvilággal A main() függvény visszatérési értéke Adatállomány: (FILE) - lineáris adatszerkezet - szöveges vagy bináris adatok a memóriában vagy háttértárolón egymás után tárolva -azelemekelérése az operációs rendszertől kérhető - a hozzáférés szekvenciális vagy tetszőleges az állománykezelés nem része a C nyelvnek szabványos könyvtári függvények segítségével valósítjuk meg a FILE olyan struktúra, amelynek belsejéhez nem férünk hozzá az operációs rendszer felé a kapcsolatot egy FILE* típusú változó biztosítja Szabványos stream-ek Szövegesek A program indításakor már meg vannak nyitva stdin : szabványos bemenet stdout : szabványos kimenet stderr : szabványos hiba-kimenet Fájl megnyitása: kapcsolat a operációs rendszerhez FILE * fopen (char * filenév, char * mode); mode két karakter r: read +: read&write w: write b: binary a: append t: text Ha nem sikerül, 0 pointerrel tér vissza. Mindig ellenőrizni kell! 6

int fclose (FILE * fp); 0, ha sikeres EOF, ha hiba történt Fájl lezárása: puffer kiírása, fájlrendszer bejegyzés Az EOF egy makró, értéke tipikusan -1 Hiba vizsgálatára használható függvények int feof (FILE * stream); IGAZ, ha end-of-file jött. int ferror (FILE *stream); IGAZ, ha hiba történt, hibakód: extern int errno Bináris írás (memória tartalmat másol!) size_t fwrite (const void * innen, size_t elemhossz, size_t elemszám, FILE * stream); -kiír az innen által mutatott területről - elemszám darab - elemhossz méretű (size_t) adatot a - stream fájlba, - visszaadja a sikeresen kiírt elemek számát, (nem byte-számot), ami hiba esetén elemszám-nál kevesebb. Bináris olvasás (memória tartalmat másol!) size_t fread (const void * ide, size_t elemhossz, size_t elemszám, FILE * stream); - beolvas az ide által mutatott területre - elemszám darab - elemhossz méretű (size_t) adatot a - stream fájlból, - visszaadja a sikeresen beolvasott elemek számát, (nem byte-számot), ami elemszám-nál kevesebb lehet, ha vége a fájlnak. Formázott írás (text) printf(char*control,...); :stdout-ra fprintf(file*fp,char*control,...);:fájlba sprintf(char*sp,char*control,...);:pufferbe A control string karaktereit változtatás nélkül kiírja, kivéve a % jellel kezdődő nyomtatásvezérlő mezőket, ezeknek rendre egy-egy további paraméter kell a... helyen. Ezek meglétét és helyességét a fordító ill. a függvény nem tudja ellenőrizni! Formázott olvasás (text) scanf(char*control,...); :stdin-ről fscanf(file*fp,char*control,...);:fájlból sscanf(char*sp,char*control,...);:stringből A control string karaktereivel megegyező szöveget kell találnia, kivéve a % jellel kezdődő nyomtatásvezérlő mezőket, ezeknek rendre egy-egy további cím paraméter kell a... helyen. Leáll, ha a szöveg nem egyezik, mindent beolvasott, vége az olvasott szövegnek, hibás az adat formátuma. A sikeresen beolvasott adatok számát adja vissza. A tárolás elnyomható. 7