Professional Documents
Culture Documents
1251 9558
Struktúrák
KURZUS
Felhasználó által definiált típusok
példa typedef long unsigned int size_t; példa typedef int* pointerInt_re;
ismert típus
új típus
typedef int egesz; az új egesz típust használva létrehozunk egy vektor típust
Példa typedef egesz vektor[4];
typedef vektor matrix[5];
a vektor típus segítségével létrehozunk egy matrix típust
egesz szorzatOsszege(vektor x, vektor y)
typedef.c {
egesz i, sum = 0;
for(i = 0; i < 4; i++)
{
sum += x[i] * y[i];
}
return sum; az új típusokat használva deklaráljuk a változókat
}
int main()
{
matrix M = {{1, 2, 3, 4}, {5, 6, 7, 8}, \
{9, 10, 11, 12}, {13, 14, 15, 16}, {17, 18, 19, 20}};
egesz osszeg = szorzatOsszege(M[1], M[2]);
> az 1. es 2. sorok elemeinek
printf("> az 1. es 2. sorok elemeinek szorzatosszege: %d\n", osszeg);
szorzatosszege: 278
return 0;
}
Struktúrák
tömb struktúra
char nev[256];
int id; tagok a struktúra mezői
DE
float fizetes;
} sz1, sz2; definálhatunk egy szemely típust
typedef struct
{
char nev[256];
példa
int id;
float fizetes; VAGY ha már a struktúra korábban címkével volt definiálva
} szemely;
tag-hozzáférési operátor .
typedef struct
elemek elérése struktúra pointer operátor -> erről később
{
char nev[256]; strncpy(sz1.nev, "Pistike”, 7);
sz1.id = 1001;
példa
int id;
float fizetes; sz1.fizetes = 3456.78;
} szemely;
értékadás érvényes KIVÉVE tömbök esetén
szemely sz1, sz2;
sz2 = sz1;
szemely szemelyek[50];
#include <stdio.h>
#include <stdlib.h> struktúra deklarálása és az új típus definíciója
typedef struct szemely
{ kivehető egy külön header állományba
char *nev;
int id;
float fizetes; FIGYELEM nem történt memóriafoglalás
} szemelyek;
int main()
{
szemelyek tmp, alkalmazottak[50];
int alkalmazottakSzama = 50; 1251 9558
deklarálás az új típust felhasználva tmp.nev = "Pistike"; ??? kvíz 2. kérdés
tmp.id = 1001;
tmp.fizetes = 3456.78;
adatokFeltoltese(alkalmazottak, alkalmazottakSzama);
return 0;
}
Struktúrák
ekvivalens művelet
int main()
{
komplex c1, c2, c3;
c2.valos = 12.3;
c2.kepzetes = 4.56;
c3.valos = 45.6;
c3.kepzetes = 7.89;
return 0;
}
Struktúra, mint stuktúra tagja
struct reszleg
{
char nev[256];
int id; használat előtt definiálva kell legyenek, mert a
}; fordítóprogramnak ismernie kell a struktúra méretét
példa
példa
scanf("%d", &id); scanf("%d", &id);
példa
DE modern számítógépek
x86
int 4 oktett többszörösére illeszkedik
kvíz 3. kérdés double 8 oktett
Memóriacímzés
az adatstruktúra igazítása
char b;
float f; ... 23 24 25 26 27 28 29 30 31
float f;
int i;
short s;
3 kitöltő oktettet tartalmaz
char a, b, c; ! kis átrendezés, óriási ugrás hatékonyságban
}; összesen 24 oktettet foglal
Struktúrák
meghatározott hosszúságú tagok
struct datum
{
unsigned int ev;
unsigned int honap;
unsigned int nap;
};
int main()
{
printf("> struktura merete oktettekben: %lu\n", sizeof(struct datum));
> a struktura merete oktettekben: 12 struct datum ma = {2024, 1, 8};
> a mai datum: 2024.1.8. printf("> a mai datum: %d.%d.%d.\n", ma.ev, ma.honap, ma.nap);
return 0;
}
Példa meghatározott a tagok hossza
datumFixed.c
#include <stdio.h>
struct datum
{
unsigned int ev;
unsigned int honap:4;
unsigned int nap:5;
};
int main()
{
printf("> struktura merete oktettekben: %lu\n", sizeof(struct datum));
> a struktura merete oktettekben: 8 struct datum ma = {2024, 1, 8};
> a mai datum: 2024.1.8. printf("> a mai datum: %d.%d.%d.\n", ma.ev, ma.honap, ma.nap);
return 0;
}
Struktúrák
meghatározott hosszúságú tagok
ha egy olyan tag, amely meghatározott bit hosszúsággal van definiálva, kisebb
adatok igazítása dimenzióval rendelkezik, mint egy int, akkor kitöltésre kerülnek a fennmaradó bitek
KORLÁTOZÁSOK
maximálisan 64 bit hosszúságú mezőket definiálhatunk
kompatibilitás és hordozhatóság kedvéért azonban ajánlott maximálisan 32 bit hosszúságú
mezőkkel dolgozni
nem használhatunk előre meghatározott hosszúságú tagokat tömbök esetén
nem hivatkozhatunk az ilyen formában lerögzített név nélküli mezők címére
nem definiálhatunk pointert, ami egy név nélküli mezőre mutat
amennyiben egy nagyobb értékkel próbálunk egy ilyen tagot inicializálni, a legkisebb jelentőségű
biteket tartja meg, amelyek a megszabott bit hosszúságon ábrázolhatók
Memóriacímzés
az adatstruktúra igazítása
a C nyelv nem engedi meg, hogy a fordító helyet takarítson meg a tagok megfelelő
sorrendezésével, más nyelvek viszont igen
DE a legtöbb C fordítónak meg lehet mondani, hogy csomagolják a struktúra tagjait egy
bizonyos igazítási szintre
a kitöltő betét maximálisan
pl. pack(2) az 1 oktettnél nagyobb tagok egy 2 oktettes határhoz igazodnak
1 oktett hosszúságú lehet
egy ilyen struktúra nagy tömbje 37.5%-val kevesebb memóriát használna, ha csomagolva lenne
#pragma pack(2) tér-idő kompromisszum
VISZONT az elemek elérése hosszabb időt venne igénybe
struct struktura
példa
{
char tag;
int elem; felhasználható adatstruktúra formázásra, továbbítás céljából szabványos protokollok használatával
};
A felsorolás típus
enum
akkor használjuk, amikor valamely változónak több mint 2, de véges (nem túl sok) értéket
kívánunk tárolni
az enum tagjai egész típusú változók/értékek, amelyekhez szimbolikus neveket kapcsolunk
első kiadásakor a C nyelv nem rendelkezett felsorolás típussal, ez később került bele
C nyelvben a felsorlásokat explicit definiálásokkal hozzuk létre, viszont NEM eredményez
memóriafoglalást
szintaxisa hasonló a struct szintaxisához
enum napok nem használunk ékezeteket, sem idézőjeleket, mert ezek változó nevek
{
hetfo, ezen változónevekhez implicit egész értékeket rendel a fordítóprogram const int
kedd,
példa
szerda,
csutortok, az implicit értékek ebben az esetben {0, 1, 2, 3, 4, 5, 6}
pentek, hetfo = 1,
szombat, viszont meghatározhatjuk egy vagy több tagnak is az értékét
vasarnap
}; a változtatás kihat az őt követő összes változó értékére {1, 2, 3, 4, 5, 6, 7}
A felsorolás típus
enum
példa
vasarnap vasarnap
}; egyszerüsíti a használatot } napok;
... ...
Példa
typedef struct termek
{
char nev[256];
float egysegnyiAr;
int mertekegyseg;
mennyiseg m;
} termek;
union.c
int main()
{
termek alma, labda;
termek *polc[N];
strcpy(alma.nev, "golden");
alma.egysegnyiAr = 6.34;
alma.mertekegyseg = 1;
1251 9558 alma.m.kg = 56.78;
strcpy(labda.nev, "kosarlabda");
labda.egysegnyiAr = 54.99;
labda.mertekegyseg = 2;
labda.m.darab = 5;
polc[0] = &alma;
polc[1] = &labda;
return 0;
}
További részletek
bibliográfia
K. N. King C programming – A modern approach, 2nd edition, W. W. Norton & Co., 2008
16. fejezet