6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1
Struktúrák 1. Összetett adattípusok: –tömb, –struktúra, –unió. Struktúra deklarációja: struct struktnev {típus1 név1; típus2 név2;...}; struct struktnev változónév; 2
Struktúrák 2. Pl. struct szgep{char gyarto[50]; enum {intel, mips, motorola} proci; long memoria, disk; enum {cga, vga, svga,egyeb} monit; }; Inicializálás: struct szgep sajat = {"Xcomp", intel, 64L, 2000L, svga}; 3
Struktúrák 3. Memóriabeli tárolása szóhatárra igazított: sizeof (struct struktnev) >= sizeof (típus1)+sizeof (típus2) sizeof (típusn) 4
Struktúrák 4. Hivatkozás a struktúra mezőire:. pont operátor struct strukttip valtazon; valtazon.mezonev Pl. printf("\n%s%d%ld%ld%d", sajat.gyarto, sajat.proci,...); 5
Struktúrák 5. Struktúra pointer Deklarációja: struct szgep{... } szerver, *p_str; p_str = &szerver; Hivatkozás a mezőkre: p_str -> gyarto/* char* */ p_str -> proci/* enum */ 6
Struktúrák 6. Struktúra tömb Deklarációja: struct szgep{... } gep[10]; Hivatkozás a mezőkre: gep[0].gyarto/* char* */ 7
Struktúrák 7. Struktúra pointer tömb Deklarációja: struct szgep{... } gep[10],*p_str[6],sajat; Hivatkozás: p_str[0]=&sajat; p_str[1]=&gep[5]; p_str[0] -> proci p_str[1] -> gyarto 8
Struktúrák 8. Beágyazott struktúrák A struktúra mezőtípusa tetszőleges típus lehet. Pl. struct halozat{struct szgep csomopont; enum{tcpip,ipx,decnet} protokoll; int felhasznszam; }egyetem[100]; Hivatkozás: egyetem[2].protokoll egyetem[1].csomopont.proci 9
Struktúrák 9. Önhivatkozó struktúrák struct elem {char nev[50];.... struct elem *kovetkezo; }; Példa később: láncolt lista. 10
Struktúrák 10. Kölcsönösen egymásra hivatkozó struktúrák struct s1 {int a, struct s2 *p; }; struct s2 {int a, struct s1 *p; }; 11
Struktúrák 11. A struktúra mint függvény paraméter érték (verem!) és cím szerint is átadható. Függvény visszatérő értéke is lehet struktúra. 12
Úniók Lehetővé teszi ugyanannak a memóriaterületnek több, különböző hivatkozással való elérését (buffer, változó szerkezetű struktúra). Deklarációja: union megoszt{int i; long l; float f; double d} uvalt; Hivatkozás: uvalt.i/* integer */ uvalt.l/* long */ Az únió mérete: max(sizeof(int), sizeof(long),sizeof(float),sizeof(double)) 13
Különféle byte-folyam feldolgozás struct adatok {int a,b,c; double d;}; union buf{ char buffer [sizeof(struct adatok)]; struct adatok bin;}; double get_buffer () { union buf b; int i; for(i=0; i<sizeof(struct adatok); i++) b.buffer[i]=getbyte(); return b.bin.d; } 14
Változó szerkezetű struktúra 1. struct hallg{int evf,tankor;...}; struct okt{int tanszek,beosztas,vegzettseg,...}; struct polgar{ enum{oktato,hallgato}tipus; union{ struct hallg uh; struct okt ut; }ember; }egyetemi; 15
Változó szerkezetű struktúra 2. switch (egyetemi.tipus) {case oktato: printf("\n%d%d%d", egyetemi.ember.ut.tanszek, egyetemi.ember.ut.beosztas, egyetemi.ember.ut.vegzettseg); break; case hallgato: printf("\n%d%d", egyetemi.ember.uh.evf, egyetemi.ember.uh.tankor); } 16
Új adattípus definíálása Egyszerűbb írásmód, karbantartás, logikai adatfüggetlenség. typedef típus típusnév; /*ez nem deklaráció*/ typedef struct fegyver {char name[50]; int tarmeret, float kaliber; } tfegyver; /*ez egy adattipus*/ tfegyver pisztoly={"Uzi",30,7.0}; tfegyver agyuk[60];... agyuk[50].kaliber=100; 17
Define vagy typedef (csapda!) #define CPOINTER char* CPOINTER a,b; --> char*a,b; typedef char* CPOINTER; CPOINTER a,b; --> char *a, *b; 18
Dinamikus memória kezelés Header: void *malloc(size_t meret) /*nem inicializál*/ void *calloc(size_t nobj, size_t meret) /*inicializál 0 byte-ra*/ Újrafoglalás: void *realloc(void* ptr, size_t meret) Visszatérő érték: a memória kezdő címe, vagy NULL Felszabadítás: void free(void*) 19
Dinamikus tömb allokálás struct elem *p; p=(struct elem *) malloc(elemszam*sizeof(struct elem)); if (p==(struct elem *) NULL) { perror("allokálási hiba"); exit(...); }... p[i].mezo1=... 20