9 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 28. prosince 2009
Struktury Struktury heterogenní struktura položky mohou být různých datových typů vystupuje jako jediný objekt Definice obecná struct název { typ položka1; typ položka2;... typ položkan; identifikator;
Struktury základní definice struct { os1,os2,os3; struktura není pojmenovaná = nedá už jinde použít lze pouze využít proměnné os1,os2,os3 základní definice s názvem struktury struct osoba{ os1,os2,os3; struktura je pojmenovaná = lze ji dále využívat v programu
Struktury oddělená deklarace od definice struct osoba{ ;... struct osoba os1; struct osoba os2,os3; odděluje definice struktury od definice proměnných lze využít proměnné os1,os2,os3
Struktury definice nového datového typu typedef struct{ OSOBA... OSOBA os1,os2; struktura není pojmenovaná pojmenovaný je nový datový typ OSOBA lze definovat proměnné os1,os2
Struktury definice nového datového typu s názvem struktury typedef struct osoba{ OSOBA... OSOBA os1,os2; struktura je pojmenovaná ostatní viz předchozí (definice nového datového typu ) využití názvu struktury pro odkaz na struktury stejného typu
Práce se statickou strukturou typedef struct { OSOBA; void main() { OSOBA os1,os2; printf( zdej jemeno: ); scanf( %s,os1.jmeno); printf( zdej vek: ); scanf( %d,&os1.vek); os1.vek = os1.vek+3; os2 = os1;
Struktury k jednotlivým položkám statické struktury přistupujeme přes tečkovou notaci. práce s prvky struktury stejná jako když nejsou zabaleny do struktury lez provést kopii celé struktury pomocí operátoru přiřazení = (včetně jednotlivých prvků pole)
Struktura a ukazatele Oblast použití: práce v dynamické paměti ve funkcích struktura a ukazatele - příklad typedef struct { OSOBA;... OSOBA os,*ukos;
Struktura a ukazatele Přidělení paměti ukazatel na nic neukazuje nutná alokace ukos = (OSOBA*)malloc(sizeof(OSOBA)); nebo přiřazení reference na již existující pamět ukos=&os Přístup k prvkům (*ukos).vek = 34; ukos->vek = 34; Poznámka *ukos.vek = 34 což odpovídá *(ukos.vek) = 34 CHYBA operátor tečka má vyšší prioritu než dereference
Struktura a ukazatele Struktury ukazující na sama sebe(na stejný datový typ) typedef struct osoba{ struct osoba *dalsi; OSOBA; Pozor na... typedef struct osoba{ struct OSOBA *dalsi; OSOBA;
Struktura a ukazatele Struktury ukazující na sama sebe(na stejný datový typ) typedef struct osoba{ struct osoba *dalsi; OSOBA; Pozor na... typedef struct osoba{ struct OSOBA *dalsi; OSOBA;
Struktura a ukazatele Struktury ukazující na sama sebe(na stejný datový typ) typedef struct osoba{ struct osoba *dalsi; OSOBA; Pozor na... typedef struct osoba{ struct OSOBA *dalsi; OSOBA;
Struktura a ukazatele typedef struct osoba { struct osoba *dalsi; OSOBA; void main(){ OSOBA *os,*prvni=null,*aktual; int pocet=3,i; i=0; while(i<pocet){ os=(osoba*)malloc(sizeof(osoba)); printf( zdej jemeno: ); scanf( %s,os->jmeno); printf( zdej vek: ); scanf( %d,&os->vek); os->dalsi=null; if(prvni==null) prvni=os; else aktual->dalsi=os; aktual=os; i++; os=prvni; for(i=0;i<pocet;i++){ printf( ----%d.osoba----\n,i+1); printf( jmeno:%s\nvek:%d\n,os->jmeno,os->vek); os=os->dalsi;
Struktura a ukazatele
Struktura v jiné struktuře struktura jež obsahuje strukturu jinou vnitřní struktura musí být definována dříve vnitřní struktura je statický prvek
Struktura v jiné struktuře typedef struct{ char ulice[20]; int cp; ADRESA; typedef struct{ int id; ADRESA adresa; ZAKAZNIK; void main(){ int i; ZAKAZNIK polezakaz[10]; polezakaz[0].id=1002; strcpy(polezakaz[0].jmeno, Novak ); strcpy(polezakaz[0].adresa.ulice, Dlouha ); polezakaz[0].adresa.cp=1234;... for(i=0;i<10;i++){ printf( id:%d\njmeno:%s\nadresa:%s %d, %s,polezakaz[i].id, polezakaz[i].jmeno,polezakaz[i].adresa.ulice, polezakaz[i].adresa.cp);
Struktury a funkce Návratová hodnota a parametr funkce struktura jako datový typ ukazatel na strukturu Volání hodnotou je vhodný jen pro malé struktury při vytváření kopií na stacku zabírá kopie struktury zbytečně místo je vyšší časová režie nelze obsah struktury měnit Návratové hodnoty rovněž nutnost kopírování struktury Poznámka Vhodnější volání odkazem tj. pomocí ukazatelů
Struktury a funkce Volání závislé na definici struct osoba { // prvky ; void Tisk(struct osoba os) nebo typedef struct { // prvky OSOBA; void Tisk(OSOBA os)
Struktury a funkce typedef struct{ float x1,x2; BOD; BOD NactiBody(){ BOD bod; bod.x1=1; bod.x2=2; return bod; void NactiBodyOkaz(BOD *bod){ bod->x1=11; bod->x2=12; void main(){ BOD bod1,bod2; bod1=nactibody(); NactiBodyOkaz(&bod2);
Struktury a funkce typedef struct osoba { OSOBA; OSOBA *Alokuj(){ OSOBA *os; os=(osoba*)malloc(sizeof(osoba)); return os; void main() { OSOBA *os=null; os=alokuj();
Struktury a funkce typedef struct osoba { OSOBA; void Alokuj2(OSOBA **os){ *os=(osoba*)malloc(sizeof(osoba)); void main() { OSOBA *os=null; Alokuj2(&os);
Struktury a ukazatele na funkce ukazatel na funkci jako datová položka pomocí ukazatele na funkci pak lze vykonat operaci nad sama sebou
Struktury a ukazatele na funkce typedef struct osoba{ void (*ukvypisosobu)(); OSOBA; void vypisosobu(osoba *os){ printf( jmeno: ); puts(os->jmeno); printf( vek: ); printf( %d,os->vek); void main(){ OSOBA os; os.ukvypisosobu=vypisosobu; strcpy(os.jmeno, pepa ); os.vek=17; os.ukvypisosobu(&os);
Uniony union je podobný struktuře položky se překrývají vyhrazená pamět odpovídá největšímu prvku jež je v unii definovaný struct { char a; int b; double c; promstruct; union { char a; int b; double c; promunion;
Uniony union - příklad typedef union { UNI; void main(){ UNI u; u.vek=97; strcpy(u.jmeno, ahoj );
Výčtový typ konstrukce podobná struktuře seznam symbolických konstant Výčtový typ - konstrukce typedef enum { konstanta1 [ = inicializace], konstanta2 [= inicializace],... ENUM položky nejsou l-hodnoty pokud neinicializujeme hodnoty prvků explicitně pak mají hodnoty 0, 1, 2,... pokud hodnoty inicializujeme pouze některé prvky, první neinicializovaný má hodnotu o 1 větší než předchůdce
Výčtový typ výčtový typ - příklad typedef enum{ FALSE, TRUE BOOL; void main(){ BOOL dal=false; if(dal==false){...
Výčtový typ typedef enum { LEFT = L, RIGHT = R, CENTER = C ZAROVNEJ; void tiskni(char *co, ZAROVNEJ zr) { switch (zr) { case LEFT: printf( %s\n,co); break; case RIGHT: printf( %\t\t%s\n,co); break; case CENTER: printf( %\t%s\n,co); break; void main() { tiskni( Ahoj, RIGHT); tiskni( Ahoj, LEFT); tiskni( Ahoj, CENTER);