XI. Diel C++ - Štruktúry a pointre

Michal Kyžňanský  /  09. 11. 2005, 00:00

Dnes si povieme o štruktúrach, ich deklarovaní a samozrejme využití. Všetko si ukážeme na názorných príkladoch. Keď budeme hovoriť o štruktúrach, je načase si objasniť aj ako funguje pointer – ukazovateľ.

Štruktúra je vlastne viac polí v sebe. To je skrátená definícia štruktúry. Využíva sa najmä pre rôzne databázy, ale je možné ju využiť aj inak. Najčastejšie pre databázy preto, že potrebujeme nejaké rozmanité druhy údajov zapísať a štruktúra je práve na toto stvorená. Deklarácia štruktúry sa robí pomocou príkazu typedef struct. Po tejto deklarácii nasleduje vkladanie prvkov, ktorá ma štruktúra obsahovať. Pri každom prvku treba uviesť koľko prvkov má dané pole obsahovať(statické polia). Deklarovanie sa píše väčšinou na miesto po hlavičkových súboroch. Deklarácia štruktúry bude vyzerať takto:

1. spôsob                                  2. spôsob
 
typedef struct{ typedef struct zoznam{ char meno[20]; char meno[20]; int cislo; int cislo; char priezvisko[20]; struct zoznam *databaza; }ZOZNAM; }ZOZNAM;


 
#include #pragma hdrstop #include "Unit1.h"
typedef struct{ AnsiString meno; int cislo; AnsiString priezvisko; }ZOZNAM; //-------------------------------------------------
#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner) { }

Prvý spôsob je vhodný, ak nepotrebujeme, aby sa štruktúra odkazovala sama na seba, teda aby štruktúra nemala meno. Druhý spôsob sa využíva vtedy, keď štruktúra obsahuje pointre a ukazuje na seba a vnorené polia. Ak chceme
v programe pracovať so štruktúrou, tak si musíme vytvoriť premennú typu ZOZNAM(v tomto prípade). Vytvoríme si premennú menom pole. Ukážeme si ako bude vyzerať práca s dynamickým poľom a so statickým v tomto prípade na jednoduchom programe.

Vložíme si 3 komponenty LabeledEdit, jeden Button a StringGrid. Program po tom, ako vyplníme kolónky meno, priezvisko a číslo ich zapíše do štruktúry a vypíše do tabuľky. V tomto prípade použijeme deklarovanie reťazcov v štruktúre pomocou AnsiString a nie pomocou poľa znakov. V ďalšom dieli si predstavíme výhody a nevýhody AnsiString a poľa znakov.


Takýto je spôsob zápisu do prvkov štruktúry pri statickej
deklarácii premennej typu ZOZNAM :


 
void __fastcall TForm1::Button2Click(TObject *Sender) { ZOZNAM pole[10];
pole[0].meno = LabeledEdit1->Text; pole[0].priezvisko = LabeledEdit2->Text; pole[0].cislo = (LabeledEdit3->Text.ToInt());
StringGrid1->Cells[2][1] = pole[0].cislo; StringGrid1->Cells[0][1] = pole[0].meno; StringGrid1->Cells[1][1] = pole[0].priezvisko; }
Takýto je spôsob zápisu do prvkov štruktúry pri dynamickej deklarácii premennej typu ZOZNAM :

 
void __fastcall TForm1::Button3Click(TObject *Sender) { ZOZNAM *pole; pole = new ZOZNAM[10];
(pole + 0)->meno = LabeledEdit1->Text; (pole + 0)->priezvysko = LabeledEdit2->Text; (pole + 0)->cislo = LabeledEdit3->Text.ToInt();
StringGrid1->Cells[0][1] = (pole + 0)->meno; StringGrid1->Cells[1][1] = (pole + 0)->priezvysko; StringGrid1->Cells[2][1] = (pole + 0)->cislo;
delete pole; }
Teraz prejdeme k pointerom a ich funkciám v programov. Pointer – ukazovateľ odkazuje na miesto v pamäti, kde je uložená nejaká premenná. Pointer neobsahuje hodnotu premennej, ale iba adresu v pamäti. Ukazovateľ zaberá 4 bajty a môže ukazovať na všetky možné dátové typy a ich premenné. Deklarácia pointera sa robí pomocou operátora *. Pointery sa najčastejšie používajú k dynamickej alokácii pamäte pri dynamických premenných.
Pri práci s dynamicky alokovanou pamäťou je dôležité, keď už premennú nepotrebujeme, treba ju z pamäte uvoľniť príkazom delete.
Príklad:

 
int *cislo; *cislo = 150; //nesprávna deklarácia
Zapisovali by sme na neznáme miesto v pamäti, pretože sme nealokovali pamäť pre túto premennú.

Správne je:

 
int *cislo;
cislo = new (int); *cislo = 150;
delete (cislo)
V budúcom dieli si predstavíme triedu AnsiString, ktorou disponuje C++ Builder a prácu s klasickým poľom znakov. Povieme si o výhodách/nevýhodách oboch postupov pri používaní štruktúry, alebo iných funkcií.

Súvisiace články: Prehľad všetkých dielov

Neprehliadnite: