Učíme se C (13.díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Učíme se C (13.díl)

12. prosince 2000, 00.00 | Struktury, možné způsoby deklarace, definice proměnných, inicializace při definici a příkaz
typedef.

Struktura, deklarace struktury, definice proměnných

Typ struktura patří mezi tzv. složené datové typy. Strukturu si můžeme představit jako jakýsi obal, který sdružuje více položek různých typů do jednoho celku. Jako příklad si můžeme vzít databázi osob, kde jsou pro každou jednotlivou osobu uloženy, kromě jména, i údaje o věku a výšce. Takovýto záznam pak můžeme implementovat pomocí struktury, která bude obsahovat příslušné položky. Jméno osoby uložíme do řetězce, pro věk postačí typ unsigned char a pro výšku zvolíme typ float. Nyní tedy můžeme přejít k vlastní deklaraci požadované struktury.

struct { char jmeno[200];
         unsigned char vek;
         float vyska;
       };

Klíčovým slovem struct uvozujeme vlastní deklaraci těla struktury. To je tvořeno dvojicí složených závorek, mezi kterými jsou deklarovány jednotlivé položky struktury tak, jako bychom definovali proměnné.

Nyní tedy máme nadeklarovanou strukturu, ale nemáme žádnou proměnnou, jejímž typem by tato struktura byla. Chceme-li tedy nějakou takovou proměnnou definovat, uděláme to stejně jako u ostatních datových typů - zápisem, kdy před identifikátor proměnné uvedeme její typ. U struktur je ale typem celý zápis, jak jsme si ho uvedli výše, proto bude definice proměnné clovek vypadat následovně:

struct { char jmeno[200];
         unsigned char vek;
         float vyska;
       } clovek;

Pokud bychom chtěli definovat více proměnných, jednoduše uvedeme více identifikátorů navzájem oddělených čárkou. Jestliže ale budeme chtít vytvořit proměnnou stejného typu na jiném místě programu, museli bychom znovu jako typ uvést celou strukturu i se všemi jejími členy. To je ovšem příliš nepohodlné a navíc by tyto struktury nebyly vzájemně kompatibilní, přestože jejich vnitřní struktura by byla stejná. Proto můžeme samotnou strukturu označit identifikátorem, který uvedeme mezi klíčovým slovem struct a vlastním tělem struktury. My zvolíme za identifikátor označující naši strukturu slovo osoba.

struct osoba { char jmeno[200];
               unsigned char vek;
               float vyska;
             };

I v tomto případě můžeme ihned definovat proměnné uvedením jejich identifikátoru před závěrečným znakem středníku. Nyní ale, díky označení struktury jejím identifikátorem, můžeme proměnnou clovek definovat i na jiných místech programu takto:

struct osoba clovek;

Nezapomínejte, že nestačí použít jenom identifikátor struktury (osoba), ale že ho ještě musí předcházet klíčové slovo struct. Existuje ale ještě jeden způsob, jak si práci se strukturami zjednodušit, a to pomocí příkazu typedef.

Příkaz typedef

Pomocí příkazu typedef můžeme v C vytvářet nové datové typy, nebo spíše jakési aliasy jiných typů. Například, chceme-li vytvořit nový datový typ uint, který bude odpovídat typu unsigned int, využijeme typedef takto:

typedef unsigned int uint;

Použití je patrné. Mezi klíčové slovo typedef a zvolený identifikátor nového datového typu (v našem případě uint) jednoduše vepíšeme typ, kterému má být nový typ ekvivalentní. Celý zápis pak zakončíme středníkem. Dále v programu místo typu unsigned int můžeme používat nově vytvořený typ uint:

uint a=25;

Pro takto jednoduché zápisy se typedef příliš nepoužívá, ale v jazyce C existují i mnohem složitější zápisy typů, pro které již má použití typedef smysl. Jedním takovým případem je použití při deklaraci struktury.

Definice struktury s použitím typedef

Vezměme si opět naši známou strukturu a nadefinujme ji s pomocí příkazu typedef.

typedef struct osoba { char jmeno[200];
                       unsigned char vek;
                       float vyska;
                     }OSOBA;

Identifikátor OSOBA teď označuje celou strukturu i s klíčovým slovem struct. Pojmenování struktury (slovem osoba za klíčovým struct) bylo v tomto případě zcela zbytečné a je tedy možné jej vynechat. Jak ale později uvidíme, bude se tento zápis hodit při definování ukazatele na strukturu, který je sám prvkem této struktury. Ale o tom až někdy jindy. Máme-li tedy strukturu nadeklarovanou, definice proměnné clovek by vypadala takhle:

OSOBA clovek;

Inicializace prvků struktury při její definici

I jednotlivé prvky struktury je možné inicializovat již při definici. To uděláme tak, že za identifikátor proměnné následovaný rovnítkem uvedeme ve složených závorkách seznam inicializačních hodnot. Pořadí a typy těchto hodnot pak musí odpovídat tomu, jak jsou položky struktury deklarovány. Inicializaci si opět předvedeme na naší struktuře OSOBA:

OSOBA clovek={"Josef Novák", 34, 182.5};

Struktura ve struktuře

Prvkem struktury samozřejmě může být i jiná, dříve deklarovaná, struktura. Zkusme nyní vytvořit strukturu ADRESA, kterou přidáme mezi prvky struktury OSOBA.

typedef struct { char ulice[200];
                 int CP;
                 char mesto[200];
               } ADRESA;

typedef struct { char jmeno[200];
                 unsigned char vek;
                 float vyska;
                 ADRESA adresa;
               } OSOBA;

Možná teď přemýšlíte, zda je možné inicializovat při definici i prvky vnořené struktury. Je to možné. Stačí uvést, jako inicializátor příslušného prvku typu struktura další seznam inicializačních výrazů, jak to ukazuje následující příklad.

OSOBA clovek={"Jana", 21, 179.3, {"Větrná", 17, "Praha"}};

Práce se strukturou

Práce se strukturou je velice jednoduchá. K jednotlivým prvkům struktury přistupujeme, jak je obvyklé i v jiných jazycích, pomocí tzv. tečkové notace. Zápisem clovek.jmeno se tedy dostaneme k prvku jmeno proměnné clovek. Lépe to ukáže následující příklad, který z pole struktur OSOBA vypíše jména všech lidí, kterým je alespoň osmnáct let.

typedef struct { char jmeno[200];
                 unsigned char vek;
                 float vyska;
               } OSOBA;

OSOBA lide[20];
int i;

/* Pro ukázku naplníme první položku pole přímo
   v programu. Dále budeme pro jednoduchost předpokládat, 
   že ostatní položky pole byly nějakým způsobem 
   také načteny.
*/

// do první struktury pole lide zapíše jmeno
strcpy(lide[0].jmeno, "Josef Novák");

//a ještě věk a výšku
lide[0].vek = 34;
lide[0].vyska = 182.5;

for (i=0; i<20; i++) 
  if (lide[i].vek >= 18) puts(lide[i].jmeno);

Na rozdíl od polí, struktury se mohou navzájem přiřazovat přímo:

OSOBA clovek1={"Hugo", 26, 150}, clovek2;

clovek2=clovek1;
// prvky proměnné clovek2 teď obsahují stejné 
// hodnoty jako prvky proměnné clovek1

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: