Kezdőoldal » Számítástechnika » Programozás » Változó hosszúságú rekordok...

Változó hosszúságú rekordok definiálása megengedett?

Figyelt kérdés
Általában a "mai újabb" programozási nyelvekben változó hosszúságú rekordok definiálása, kezelése megengedett, vagy úgy vannak vele: "a tárhely elég bőséges a mai világban és minek ez".

2022. aug. 28. 16:38
1 2 3
 11/29 anonim ***** válasza:
23%
Amit szeretnél, tételesen, hogy a string tipusú adatelemeknél az adat valódi hossza legyen eltárolva, nos, ennek csak statikus adatoknál lenne hozadéka, mivel a dinamikus adattömegben történő változások lekezelése igen jelentős sebességcsökkenéssel járna.
2022. aug. 28. 17:59
Hasznos számodra ez a válasz?
 12/29 A kérdező kommentje:

Pascal-os múltból.

Mondjuk igen, rendezéskor, rekord törlésekor stb nagyon kellene figyelni és az egyes "statikus hosszúságú stringeket" lekezelni.

2022. aug. 28. 18:05
 13/29 anonim ***** válasza:
35%

A pascalnak épp ez az előnye, hogy string tipusú adattagok esetében az adattag méretét szabadon lehet deklarálni.

Ha az adattag elő- vagy utónév, akkor optimálisra be lehet szabályozni az adattag maximális méretét. Mondjuk igy


vezeteknev: string[32];

utonev : string[24];


De ez csak látszólag dinamikus hossz, nyereséget nem hoz, mert a deklarált méret mindig foglalásra kerül, ha ki lesz töltve, ha nem.

Persze még igy is jobb a stringnél (mivel ez 256 byte-ot foglal akkor is, ga csak egy char-t tartalmaz), vagy a pascal stringnél.

2022. aug. 28. 18:18
Hasznos számodra ez a válasz?
 14/29 anonim ***** válasza:
46%

"Mondjuk igen, rendezéskor, rekord törlésekor stb nagyon kellene figyelni és az egyes "statikus hosszúságú stringeket" lekezelni."

2022 van.

Egy pár évtizede túlléptek a programnyelvek az efféle problémákon.

2022. aug. 28. 18:23
Hasznos számodra ez a válasz?
 15/29 anonim ***** válasza:
32%

#7, Amit rekordnak hívsz, az kb. a struktúra vagy esetleg osztály. Rekord a tömb jellegű adatszerkezeteknél merül fel, ahol az ilyen struktúrákat folytonosan tárolják. (Akár pl. a relációs adatbázisok.) Ahhoz, hogy egy ilyen rekordot egy lépésben megtaláljunk (indexeljünk) pl. egy fájlban, muszáj azonos méretűnek lenniük. (Egy dinamikus láncban pl. nem muszáj, de ott nem is fogod egy lépésben megtalálni az adott "indexű" elemet.)

A másik dolog a karakterlánc avagy string. Ha tömbről, tömb rendezésről beszélünk, akkor jellemzően a tömb egy eleme (hívjuk rekordnak) csak egy pointert tartalmaz a string-re. Ha mondjuk egy fájlból olvasunk be rekordokat, amiket speckó módon választanak el egymástól, tehát nem a méretük alapján lehet megtalálni az elejüket (pl. csv és hasonló fájlok), azokat a string-eknek általában külön foglaljuk le a helyet és a létrehozott tömbben csak rájuk mutató pointereket tároljuk.

Visszatérve a rendezésre: Tömb gyors rendezése, vagy a rendezett tömbben való keresés arra épül, hogy a tömb indexelhető. Például bináris kereséskor először egy lépésben akarjuk megtalálni a tömb középső elemét. Ha változó hosszúak lennének a tömb elemei, akkor ezt elég hosszadalmas lenne, és ez csak az első lépés.


Amúgy persze lehetnek változó hosszúságúak az elemek, ahogy a fent említett .csv fájlokban, vagy általában a szöveges fájlok is ilyenek, amiket pl. soronként kezelünk. Csakhogy az első példánál az a rekordok adatszerkezetből byte stream-é átalakított változata (ld. serializing/parsing), a második példában a sima sorokat pedig nem szoktuk rekordnak hívni.

2022. aug. 28. 23:25
Hasznos számodra ez a válasz?
 16/29 anonim ***** válasza:
74%
Különböző típusú, de logikailag összetartozó adatelemek együttese a rekord.
2022. aug. 29. 03:52
Hasznos számodra ez a válasz?
 17/29 anonim ***** válasza:
74%

Pl. az SQL-ben nyelvi elem a VARCHAR típus (változó hosszúságú szöveges mező). Pont a szövegeknél vezették be, mert mindenki tudja, hogy a fix hosszúságú szövegekkel "csak a baj van". De ehhez hasonló probléma a "blob" (Binary Large Object, különböző adatbázis rendszerek esetleg másképpen nevezik, találkoztam már byte area típusnévvel is erre), a "tlob" (Text Large Object) adattípus. Bár ezek (főleg a blob) nem mindig kereshetőek (indexelni pl. nem is lehet általában ezeket), de a rekord méret dinamikus (pl. blob tipikus alkalmazása amikor képet tesznek adatbázisba, ami egyes szerint isten káromlás kategória, mások használják gyakran, ez egy hit vita, nem kívánok bele menni most, mert mindkét tábornak van igaza, és hetekig hónapokig lehet rajta vitázni, hogy melyik az "abszolút jó megoldás" /értsd tároljunk-e képet az adatbázisban avagy ne az adatbázisba tegyük a képet/).

Nem szöveges mezők esetén eleve számokat tárolunk ott meg ritka a dinamikus. Ha meg egy mező dinamikus tömb lenne amiben számok vannak arra meg a legegyszerűbb és "legszebb" megoldás egy csatolt külön tábla ahol kulcs-érték-stb. tárolhatóak erre az összes adatbázis és hasonló rendszer képes).

2022. aug. 29. 11:17
Hasznos számodra ez a válasz?
 18/29 anonim ***** válasza:
65%

Sok nyelvben ez korlátolt, vagy hát nehéz dió. Kevés nyelvben van ez rugalmasan kezelve. Ahogy mondják a sebesség az problémás lehet itt ott...


Fejlesztői oldalól az a jobb ha minél kevesebb dologgal kell foglalkozni. Tehát ha 1 karakter vagy egy novella fér bele egyben az a legjobb, nem kell vele foglalkozni. Szöveges, azt kész.

PL kevesek által ismert nyelv a Progress. Van a character aztán csókol ödön. 32kbyte fér bele. (Adatbázisban is, kereshető, indexelhető, minden is :) ) Na de ha ez kevés lenne van LongChar is hozzá (adatbázisban ez már nincs) :D Ami nem is direkt változó hanem memória cím, amin 1GB fér el :)

2022. aug. 29. 14:02
Hasznos számodra ez a válasz?
 19/29 anonim ***** válasza:
0%

"VARCHAR típus"

Hajdanán volt olyan, hogy 'memo' field, az kb. ugyanezt tudta. És nem a rekordban tárolódott már akkor sem. ;)

2022. aug. 29. 23:17
Hasznos számodra ez a válasz?
 20/29 A kérdező kommentje:

program valtozo_hossz;


type

rektip = record

ch : array of char;

szam : longint;

end;


var

r : array of rektip;

i : byte;

begin

setlength(r,1);

setlength(r[0].ch,4);

r[0].ch:='alma';

setlength(r,2);

setlength(r[1].ch,5);

r[1].ch:='korte';

for i:=0 to high(r[0].ch) do

write(r[0].ch[i]);

writeln;

for i:=0 to high(r[1].ch) do

write(r[1].ch[i]);

writeln;

readln;

end.

2022. szept. 21. 15:31
1 2 3

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!