Kezdőoldal » Számítástechnika » Programozás » Pascal-ban halmaz típus...

Pascal-ban halmaz típus esetén a halmazban lévő elem értékét miként tudnám kivenni egy változóba? (bővebben lent)

Figyelt kérdés

Tudom, hogy a halmaz egyes elemeire közvetlenül hivatkozni nem lehet, de remélem, hogy valamilyen módon adott változó értékét ki lehet venni... Alább egy kód, azt szeretném, hogy 'i' és 'j' értékét megcserélni a halmaz felhasználásával, előbb 'i'-t utána 'j'-t teszem be, ezután szeretném ha úgy tudnám kivenni az elemeket hogy ami az egyik változó értéke volt, az a másiké legyen. Tudom hogy segédváltozóval oldható meg legegyszerűbben a csere, de a halmazos megoldás érdekelne.


var

halmaz:set of byte;

i,j:byte;

begin

halmaz:=([]);

i:=5;

j:=10;

include(halmaz,i);

include(halmaz,j);

end.



2014. dec. 19. 16:13
1 2
 1/13 anonim ***** válasza:
67%

A Set struktúra nem igazán alkalmas erre, mivel nem rendezett, nincs az elemei közt sorrendiség, így véletlen elérés sem.


Egy halmazra tekints úgy, hogy fogalmad sincs, mi van benne, csak azt kérdezheted le, hogy egy konkrét elem benne van-e.


Véletlen elérést tömbbel fogsz tudni megoldani.

2014. dec. 19. 16:53
Hasznos számodra ez a válasz?
 2/13 anonim ***** válasza:

Off: Nehogy már véletlennek hívjuk, az annyira... pfej! :D Legyen inkább tetszőleges, az sokkal szebb! :D

/Off

G.

2014. dec. 19. 17:02
Hasznos számodra ez a válasz?
 3/13 anonim ***** válasza:
Mea culpa :D
2014. dec. 19. 17:06
Hasznos számodra ez a válasz?
 4/13 A kérdező kommentje:

Reménykedtem, hogy van valami megoldás...

Igazából a klasszikus csere felgyorsítására akartam alkalmazni, van egy program ami tömbön végez cserét és mivel sok csere van, be tud lassulni eléggé, reménykedtem, hogy "egy ilyen megoldás felgyorsítaná".


Klasszikus csere alatt azt értem, hogy tomb[i] és tomb[j] értékét megcserélem egy segédváltozót használva. Gondolom hogy ezt a folyamatot nem igazán lehet meggyorsítani, vagy van rá remény?

2014. dec. 19. 17:35
 5/13 SimkoL ***** válasza:

Röviden: A halmaz nem erre való.

Gyorsításhoz egy kis assembly kód.

2014. dec. 19. 18:09
Hasznos számodra ez a válasz?
 6/13 anonim ***** válasza:

Lehet a dolgon gyorsítani, de ahhoz valószínűleg assembly kell.

A megoldás lényege, hogy regiszterekkel sokkal gyorsabban lehet dolgozni, mint a memóriában tárolt adatokkal, ráadásul x86 platformon létezik az XCHG reg8,reg8 utasítás, így a köztes változót is voltaképpen kihagyhatod*.


*látszólag két regiszter veszi át a szerepét, de valójában azok a regiszterek minden esetben ott dolgoznak a háttérben.


Valószínű azonban, hogy nem a cserén kellene megpróbálni gyorsítani, hanem a programod valamely másik aspektusát szükséges optimalizálni.

2014. dec. 19. 18:12
Hasznos számodra ez a válasz?
 7/13 A kérdező kommentje:

Az assembler-es megvalósításon vagy a regiszterekkel történőhöz mennyit kellene tanulni? (Assembly kódot olvastam már, elég bonyolult volt), a régi Dos-os időkben láttam Turbo Pascal-os regisztereket kezelő programot is de már nem igazán emlékszem.

Nem tudnék találni olyan csere-függvényt amely Assembly-ben van írva és tudnám használni amire szeretném?

2014. dec. 19. 18:15
 8/13 anonim ***** válasza:

Hát azért kéne tanulgatni egy darabig.

[link]


Parancsolj, ez egy nagyon jó Assembly könyv az alapokhoz. Mára már elég elavult, de a lényeg megtanulásához nincs tökéletesebb.


Továbbra is fenntartom azonban, hogy nagy valószínűséggel nem a cserebere lesz a kódodban a szűk keresztmetszet.


Inline assemblyvel talán (ezer éve nem pacaloztam) megodható így:


begin asm;

˙˙˙˙mov al,tomb[i]

˙˙˙˙mov ah,tomb[j]

˙˙˙˙xchg al,ah

˙˙˙˙mov tomb[i],al

˙˙˙˙mov tomb[j],ah

end;


Persze ez így azért még elég primkó megoldás, és még ha működik is, nem biztos, hogy sokat segít, mivel csak a köztes változót, illetve annak lassú elérését iktatja ki.


Nyugodtan tanuld csak meg azt az assembly-t, jól fog jönni a programok működésének megértéséhez...

2014. dec. 19. 18:25
Hasznos számodra ez a válasz?
 9/13 anonim ***** válasza:

Még valami:

A függvényt ebben a granularitásban felejtsd el, mert azt a keveset, amit gyorsítana a köztes változó kiütése, elvinné a függvényhívás többletterhelése.

2014. dec. 19. 18:27
Hasznos számodra ez a válasz?
 10/13 A kérdező kommentje:

Köszönöm a választ.

Ha a cseréket kikokmmentezem, akkor a futási idő felére esik, persze lehetséges hogy indokolatlanul sok a csere.

Az assembler kód amit küldtél, nem tetszik a Pascal-nak, nem fordítja le.

Ha nem platformfüggetlen az Assembler, akkor is érdemes megtanulni? (én legalábbis úgy tudom hogy pont azért nem platformfüggetlen, mert alacsony gépikódú, mondjuk ezt azért nem értem mert pont ezért kellene annak lennie, de úgy tudom hogy ha van egy assembler kód a programban, azt minden OS alá kell szabni ahol használni akarják a programot.

2014. dec. 19. 19:01
1 2

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!