Štruktúra záznam. Operácie s bitovými údajmi
Stiahnuť PDF · 71 kBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Programovanie - prednáška
č. 8
1
Štruktúra záznam
Operácie s bitovými údajmi
1. Štruktúra záznam
•
zložený typ štruktúry záznam
•
varianty štruktúr záznam
•
reprezentácia štruktúry záznam
•
použitie štruktúry záznam v jazyku C
2. Operácie s bitovými údajmi
•
operácie s bitovými údajmi v jazyku C
•
operátory a výrazy s bitovými údajmi
•
bitové polia
Programovanie - prednáška
č. 8
2
Štruktúrované údajové objekty
• Najbežnejší spôsob vytvárania štruktúrovaných
typov
• Spájanie ľubovoľných prvkov (zložiek) do
zložených typov
• Príklady
– komplexné čísla zložené z dvoch reálnych čísel
– súradnice bodov zložené z dvoch alebo viacerých
reálnych čísel
– opis osoby pomocou niekoľkých charakteristík (meno,
dátum narodenia, pohlavie, atď.)
Programovanie - prednáška
č. 8
3
Zložený typ
• Zložený typ je kartziánsky súčin jeho
zložkových typov
• Množina hodnôt zloženého typu je tvorená
všetkými možnými kombináciami hodnôt
jednotlivých typov zložiek
• Kardinalita zloženého typu je daná
súčinom kardinalít typov zložiek
Programovanie - prednáška
č. 8
4
Štruktúra záznam
• V oblasti spracovania údajov sa zložené typy
používajú na štruktúrovaný opis osôb alebo
predmetov
– zaznamenávajú podstatné charakteristiky osôb alebo
predmetov
• Najčastejšie sa tieto údaje vyskytujú ako záznamy
v súboroch alebo databázach
• Pri opise zložitých štruktúr takejto povahy
uprednostňujeme termín záznam pred pojmom
karteziánsky súčin
Programovanie - prednáška
č. 8
5
Definícia štruktúry záznam
•
Definícia štruktúry záznam (zjednodušene štruktúry) v jazyku C
struct [názov] {
typ
1
zložka
1;
typ
2
zložka
2;
...
typ
n
zložka
n;
} [zoznam_premenných];
•
Ak je definovaný názov štruktúry, môžeme ho použiť ako nový typ na
definíciu ďalších premenných
struct názov zoznam_premenných;
Programovanie - prednáška
č. 8
6
Príklady použitia
•
Reprezentácia súradníc bodu štruktúrou
struct bod {
double x;
double y;
};
•
Definícia konkrétnych bodov pomocou štruktúry
struct bod a;
struct bod b = {10, 20};
•
Reprezentácia osoby štruktúrami
struct datum { int den, mesiac, rok };
struct osoba {
char meno[30];
struct datum datum_narodenia;
unsigned long evidencne_cislo;
};
•
Definícia konkrétnych osôb a dátumov pomocou štruktúr
struct osoba zamestnavatel, zamestnanci[20], *p;
struct datum dnes, splatnost;
Programovanie - prednáška
č. 8
7
Výber zložiek štruktúry záznam
•
Identifikátory zložiek záznamov sú uvedené v rámci definície
zloženého typu
•
Prístup ku zložkám je možný pomocou operátora sprístupnenia zložky
záznamu (selektora) aplikovaného na premenné typu záznam
premenná.zložka
i
•
Príklady
a.x
zamestnavatel.meno
zamestnanec[i].datum_narodenia.mesiac
dnes.den
Programovanie - prednáška
č. 8
8
Výber zložiek štruktúry záznam
•
Ak je premenná typu záznam definovaná ako smerník na štruktúru
záznam, môžeme použiť namiesto
(*smerník).zložka
i
iný operátor výberu zložky záznamu pre jednoduchší zápis
smerník->zložka
i
•
Príklad
p->meno
Programovanie - prednáška
č. 8
9
Vlastnosti štruktúr záznam
•
Ľubovoľný prístup k jednotlivým zložkám, podobne aj v poli
•
Všeobecnejšia ako pole, pretože jednotlivé zložky nemusia byť
rovnakého typu
•
Selektory zložiek záznamov sú pevne dané identifikátormi v rámci
definície záznamu
– pri použití poľa môžu byť selektory (indexy) vypočítateľné hodnoty, čo je
flexibilnejší prístup
•
So štruktúrami pracujeme ako s celkom, môžeme ich kopírovať resp.
priraďovať ako celok
•
Môžeme získať adresu štruktúry a pracovať so smerníkom na štruktúru
– pri použití štruktúr ako parametrov funkcií si treba uvedomiť, že sa
odovzdávajú ako jedna komplexná hodnota, ktorá sa musí celá
prekopírovať
– je efektívnejšie odovzdávať smerníky na štruktúry, to isté platí o
odovzdávaní štruktúry ako návratovej hodnoty funkcie
Programovanie - prednáška
č. 8
10
Varianty štruktúr záznam
• Z praktického hľadiska je výhodné považovať dva
typy za varianty toho istého typu
• Napr. typ súradnice môžeme považovať za
zjednotenie dvoch variantov – kartéziánskej (dve
dĺžky) a polárnej (jedna dĺžka, jeden uhol)
súradnicovej sústavy
• Takáto definícia štruktúry záznam umožňuje, aby
údajový objekt bol interpretovaný rôznym
spôsobom
• Kardinalita takejto štruktúry je daná súčtom
kardinalít jednotlivých typov variantov
Programovanie - prednáška
č. 8
11
Definícia štruktúry záznam
s variantmi
•
Definícia štruktúry záznam s variantmi (zjednodušene union) v jazyku C
union [názov] {
typ
1
zložka
1;
typ
2
zložka
2;
...
typ
n
zložka
n;
} [zoznam_premenných];
•
Takto definovaný union umožňuje prístup k jednému údaju pomocou rôznych
n zložiek rôznych typov
•
V jazyku C je práca s unionom je rovnaká ako práca so štruktúrou
–
treba si uvedomi
ť, že všetky zložky unionu uchovávajú ten istý údaj a nie n
rôznych údajov
–
prístup ku konkrétnej zložke unionu závisí od toho, akým spôsobom chceme s
údajom pracova
ť (máme n rôznych spôsobov)
Programovanie - prednáška
č. 8
12
Príklady použitia
•
Pri používaní štruktúr záznam s variantmi často kombinujeme použitie
štruktúr a unionov
•
Pre identifikáciu konkrétnej varianty často zavádzame zložku
nazývanú diskriminátor typu alebo rozlišovacia zložka
•
Definícia bodu pomocou štruktúry s dvoma variantmi (karteziánske
alebo polárne súradnice)
struct bod {
enum {KARTEZIANSKE, POLARNE} druh;
union {
struct {double x, y;} kartezianske;
struct {double r, fi;} polarne;
} suradnice;
};
struct bod a;
Programovanie - prednáška
č. 8
13
Výber variantov zložiek štruktúry
•
Selektor pre výber jednotlivých zložiek takéhoto záznamu je daný úrov
ňami definície
jednotlivých štruktúr a unionov
a.druh
a.suradnice.kartezianske.x
a.suradnice.polarne.fi
•
Vo všeobecnosti môže programátor použi
ť ktorúkoľvek variantu záznamu
suradnice
,
čo môže spôsobiť vážne sémantické chyby programu
•
Odporú
ča sa, aby príslušné operácie s jednotlivými variantmi boli striktne rozlíšené
(použitie vetvenia) pomocou rozlišovacej zložky druh
–
takto môžeme v programe jednoducho overi
ť správnosť použitia selektora
–
sta
čí overiť, či každá vetva obsahuje iba korektné selektory
switch (a.druh) {
case KARTEZIANSKE:
printf("Kartézske: x = %g, y = %g\n",
a.suradnice.kartezianske.x, a.suradnice.kartezianske.y);
break;
case POLARNE:
printf("Polárne: r = %g,
ϕ = %g\n",
a.suradnice.polarne.r, a.suradnice.polarne.fi);
break;
}
Programovanie - prednáška
č. 8
14
Reprezentácia štruktúr záznam
•
Záznamy sú zobrazované do pamäti postupným zobrazovaním ich
jednotlivých zložiek
•
Adresu i-tej zložky záznamu vzhľadom na začiatočnú adresu záznamu
nazývame posunutie (alebo offset) a
i zložky i
a
i = s1 + s2 + ... + si – 1
pričom s
j je ve
ľkosť j-tej zložky záznamu
•
Celková veľkosť záznamu je daná súčtom veľkostí jej zložiek
•
Zložky záznamu sú prístupné len prostredníctvom presne stanovených
identifikátorov
–
každé s
j môže mať inú hodnotu a výpočet posunutia sa preto nedá automaticky
vypo
čítať z pozície zložky
•
Posunutia zložiek sú známe už počas kompilácie
–
nie je potrebné vykonáva
ť výpočet pozície zložky (ako napr. v prípade indexov
po
ľa) počas realizácie programu
Programovanie - prednáška
č. 8
15
Reprezentácia štruktúr záznam
s variantmi
• Štruktúra záznam s variantmi (union) reprezentuje jednu
informáciu prístupnú viacerými spôsobmi
• Z toho vyplýva, že každá zložka takéhoto unionu je
zobrazená na začiatočnej adrese celého záznamu
• Celková veľkosť unionu je daná veľkosťou najväčšej
zložky unionu
a
b
b
c
struct {
int a;
float b;
char c;
};
union {
int a;
float b;
char c;
};
a
c
Programovanie - prednáška
č. 8
16
Operácie s bitovými údajmi
• Tvorba výrazov pre vykonávanie základných
operácií s jednotlivými bitmi alebo segmentmi
bitov (napr. bajtmi alebo bitovými poliami)
• Prostriedok pre prístup k údajom na najnižšej –
strojovej úrovni
• Používajú sa na manipuláciu bitov v rámci
údajových objektov celočíselných typov (char,
int
, long, unsigned)
Programovanie - prednáška
č. 8
17
Použitie operácií s bitmi
• Programovanie ovládačov (driver) rozličných
technických zariadení a aplikácií s priamym
prístupom k nim
• Pamäťovo úsporná implementácia logických
údajových objektov (stačí 1 bit) a údajov, ktoré
majú užší interval hodnôt, ako základné typy
(napr. pre zakódovanie 8 hodnôt nám stačia iba 3
bity)
• Programovanie emulátorov operácií v pohyblivej
rádovej čiarke, ak nie je k dispozícii príslušný
procesor
Programovanie - prednáška
č. 8
18
Bitové operátory
Operátor
Význam
Priorita
Asociatívnos
ť
~
jednotkový doplnok
14
←
bitov v slove
>>
posun bitov v slove
11
→
vpravo
<<
posun bitov v slove
11
→
v
ľavo
&
logický sú
čin bitov
8
→
dvoch slov
^
neekvivalencia bitov
7
→
dvoch slov
|
logický sú
čet bitov
6
→
dvoch slov
Programovanie - prednáška
č. 8
19
Jednotkový doplnok bitov v slove
•
Táto operácia vykoná inverziu všetkých bitov v slove – bit s hodnotou
1 zmení hodnotu na 0 a bit s hodnotou 0 zmení hodnotu na 1
~slovo
•
Používa sa tiež na vytváranie implementačne nezávislých konštánt
– slovo typu int môže byť na rôznych počítačových systémoch
implementované rôzne (napr. 16 bitové slovo alebo 32 bitové slovo)
0177777
šestnásťbitové slovo so všetkými bitmi
hodnoty 1
~0
slovo so všetkými bitmi hodnoty 1 bez ohľadu na
koľkých bitoch je implementované
Programovanie - prednáška
č. 8
20
Posun bitov v slove
•
Bity v slove sú posúvané o konkrétny počet v slove doprava alebo
doľava
slovo << n
slovo >> n
•
Posun o n bitov doľava predstavuje násobenie slova číslom 2n
•
Posun o n bitov doprava predstavuje delenie slova číslom 2n
•
Pri posune doľava sa sprava do slova nasúvajú bity s hodnotou 0
•
Pri posune doprava sa zľava do slova nasúva
– znamienkový bit – aritmetický posun
– bit s hodnotou 0 – logický posun
– je to implementačne závislé, pričom pre nezávislú implementáciu je
potrebné definovať slovo typu unsigned (potom sa vždy realizuje
logický posun)
Programovanie - prednáška
č. 8
21
Logický súčin bitov dvoch slov
•
Táto operácia vykoná logický sú
čin jednotlivých bitov na tých istých pozíciách dvoch
slov
slovo1 & slovo2
•
Používa sa
často na nulovanie bitov v bitovom segmente
int a;
a = a & 0177400;
spôsobí vynulovanie nižších 8 bitov v premennej a, za predpokladu, že typ int je
realizovaný na 16 bitoch
lepšie je použi
ť implementačne nezávislú konštantu
a = a & ~0377;
Programovanie - prednáška
č. 8
22
Logický súčet bitov dvoch slov
•
Táto operácia vykoná logický súčet jednotlivých bitov na tých istých pozíciách
dvoch slov
slovo
1
| slovo
2
•
Používa sa často na nastavenie bitov v bitovom segmente
int a, b;
b = b << 4;
a = a & ~0360;
a = a | b;
zápis celočíselnej hodnoty z premennej b do premennej a do bitového
segmentu od 4. po 7. bit (v premennej b predpokladáme hodnotu 0 – 15)
Programovanie - prednáška
č. 8
23
Bitové polia
• Umožňujú štruktúrovaný pohľad na
neštruktúrovaný typ int
• Definujú (deklarujú) sa ako jedna zložka
štruktúry záznam
• Umožňujú odkazovať sa na zložky, veľkosť
ktorých je špecifikovaná v bitoch
• Vhodné ak chceme považovať údajový objekt za
súbor bitov (napr. kvôli šetreniu pamäťového
miesta, pri komunikácii s V/V zariadeniami, atď.)
Programovanie - prednáška
č. 8
24
Definícia bitového poľa
•
Definícia bitového poľa je v jazyku C realizovaná pomocou štruktúry
struct [názov] {
unsigned [zložka
1]
: velkos
ť
1;
unsigned [zložka
2]
: velkos
ť
2;
...
unsigned [zložka
n]
: velkos
ť
n;
} [zoznam
_premenných];
•
Hodnota velkosť
i nesmie presiahnú
ť veľkosť typu unsigned int
•
Ak je velkosť
i rovná 0, potom
ďalšia zložka bitového poľa bude začínať na
novom slove unsigned int
•
Ak je vynechaný identifikátor zložka
i, potom bude
ďalšie bitové pole
posunuté o veľkosť uvedenú za :
Programovanie - prednáška
č. 8
25
Operácia s bitovým poľom
• S bitovým poľom sú dovolené všetky
operácie ako s typom int, okrem operátora
výpočtu adresy &
• V bitovom poli nie je dovolené použiť ako
prvok pole
• Bitové polia sú implementačne závislé
Programovanie - prednáška
č. 8
26
Príklady použitia bitového poľa
•
Príklad použitia bitových polí ako komunika
čného rozhrania nejakého zariadenia
struct device_interface {
unsigned R_W : 1;
// bitové pole o ve
ľkosti 1 bit
unsigned : 0;
// prechod na nové slovo
unsigned Dir1 : 1;
unsigned Dir2 : 1;
unsigned Dir3 : 1;
unsigned : 4;
// 4 bity budú nevyužité
unsigned Mode : 3;
} device;
// definícia premennej pozostávajúcej z bitových polí
•
Bitové polia pre prácu v pohyblivej rádovej
čiarke (predpokladáme int aj float na
32 bitov) a union s variantami použitia reálneho
čísla
struct PHRC {
unsigned znamienko_mantisy : 1;
unsigned exponent : 8;
unsigned mantisa : 23;
};
union {
float x;
struct PHRC y;
} realne_cislo;
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky