pascal rozsah pola

Programovacie jazyky, rady, poradňa...
durkovicovic
Novice
Novice
Príspevky: 6
Registrovaný: 01 máj 2009, 12:07

pascal rozsah pola

Príspevok od používateľa durkovicovic »

Ahojte uz nejaky tyzden sa snazim vyriesit problem ktory bude asi dost jednoduchy ale napriek tomu nedari sa mi ho vyriesit. Potrebujem v pascale zadefinovat pole vacsie ako je jeho rozsah. Potreboval by som nieco ako array[1..1000000] pascal mi ale nepodpori takyto velky rozsah a vsetky navody co som na nete nasiel boli pre delphy (tam asi takyto zapis funguje). Poradi mi pls niekto skusenejsi kto sa s tym uz stretol? Vopred dakujem za kazdu radu.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

sprav to cez lineárny zoznam. Aj tak ale netuším načo ti treba taký veľký rozsah. Radšej si premysli postup a sprav ho efektívnejším :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Dosť pochybujem, že sa ti to pre DOS podarí urobiť. Aj keby mala každá položka len bajt, tak by to zaberalo 1MB + ďalšie miesto na pomocné ukazovatele a v DOS máš prístupných len 640kB. Takže by si musel použiť nejakú rozšírenú pamäť (a tým sa ti to môže dosť skomplikovať).
durkovicovic
Novice
Novice
Príspevky: 6
Registrovaný: 01 máj 2009, 12:07

Príspevok od používateľa durkovicovic »

chrono napísal:Dosť pochybujem, že sa ti to pre DOS podarí urobiť. Aj keby mala každá položka len bajt, tak by to zaberalo 1MB + ďalšie miesto na pomocné ukazovatele a v DOS máš prístupných len 640kB. Takže by si musel použiť nejakú rozšírenú pamäť (a tým sa ti to môže dosť skomplikovať).
ano, viem, ale potrebujem to naozaj takto. Nie je to moje zadanie ale musi to tak byt.
audiotrack napísal:sprav to cez lineárny zoznam. Aj tak ale netuším načo ti treba taký veľký rozsah. Radšej si premysli postup a sprav ho efektívnejším :)
diki za radu skusim ten obojsmerny linearny zoznam :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

(640kB bez nejakých 100-200kB) / 8 bajtov na oba ukazovatele je nejakých 70000 prvkov (a to som nepočítal miesto na samotné údaje). ;) Takže ak naozaj potrebuješ milión prvkov, nevyhneš sa používaniu EMS alebo XMS.

PS: Prečo nepoužiješ Delphi (alebo nejakú inú 32 bitovú verziu Pascal)?
durkovicovic
Novice
Novice
Príspevky: 6
Registrovaný: 01 máj 2009, 12:07

Príspevok od používateľa durkovicovic »

chrono napísal:(640kB bez nejakých 100-200kB) / 8 bajtov na oba ukazovatele je nejakých 70000 prvkov (a to som nepočítal miesto na samotné údaje). ;) Takže ak naozaj potrebuješ milión prvkov, nevyhneš sa používaniu EMS alebo XMS.

PS: Prečo nepoužiješ Delphi (alebo nejakú inú 32 bitovú verziu Pascal)?
Je to zadanie do skoly, spravit porovnanie triediacich algoritmov s tym ze ked vymyslim sposob ako vytriedit viac prvkov ako je rozsah pola (idealne by bolo triedit 100 000 az 1 000 000 prvkov) tak ziskam nejake bonusove body k skuske. Taktiez to beriem ako vyzvu ci to dokazem, preto hladam sposob ako a v tejto chvili je mi uz kazda rada vzacna ;)

Co je to EMS, XMS?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

V prvom rade potrebuješ dosiahnuť to, aby si toľko prvkov dokázal vytvoriť (a až potom ich môžeš triediť). A ako som už písal, v DOS to môže byť problém. :)

XMS
EMS
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

ems je expanded memory, a xms je extended memory. Podstatou je že využíva ďalších 384 KB ktoré sú bežne vyčlenené pre periférne zariadenia.
ja to nebyl
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 27 jún 2008, 19:46

Príspevok od používateľa ja to nebyl »

podla mna to nie je mozne ... :( s takymto niecim som sa v pascale este nestretol
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

V DOS môžeš adresovať maximálne 1MB. EMS umožní "namapovanie" kúsku pamäte, ktorá je fyzicky nad týmto rozsahom, pod 1MB hranicu (takto sa dá tuším využiť nejakých 16MB).
ja to nebyl napísal:podla mna to nie je mozne ... :( s takymto niecim som sa v pascale este nestretol
S čím presne si sa v Pascale nestretol? :) Niekde na disku by som pravdepodobne našiel svoj starý program naprogramovaný v Pascal, ktorý pomocou EMS ukladá dosť veľké polia (väčšie, ako sa normálne dajú ukladať pri "čistom" DOS).
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

chrono napísal:V DOS môžeš adresovať maximálne 1MB. EMS umožní "namapovanie" kúsku pamäte, ktorá je fyzicky nad týmto rozsahom, pod 1MB hranicu (takto sa dá tuším využiť nejakých 16MB).

...
nie je ems náhodou to čo som písal vyššie? Toto premapovanie je xms, nie?
durkovicovic
Novice
Novice
Príspevky: 6
Registrovaný: 01 máj 2009, 12:07

Príspevok od používateľa durkovicovic »

chrono napísal:V DOS môžeš adresovať maximálne 1MB. EMS umožní "namapovanie" kúsku pamäte, ktorá je fyzicky nad týmto rozsahom, pod 1MB hranicu (takto sa dá tuším využiť nejakých 16MB).

S čím presne si sa v Pascale nestretol? :) Niekde na disku by som pravdepodobne našiel svoj starý program naprogramovaný v Pascal, ktorý pomocou EMS ukladá dosť veľké polia (väčšie, ako sa normálne dajú ukladať pri "čistom" DOS).
Ake velke polia? Mozes prosim trosku popisat ten program?
ja to nebyl
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 27 jún 2008, 19:46

Príspevok od používateľa ja to nebyl »

chrono respekt ! ak to mas niekde skus to upnut zislo by sa v buducnosti :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Pravda je (pravdepodobne) niekde uprostred.
Pri XMS sa tá pämať nad 1MB nedá používať priamo, dáta sa tam musia dávať pomocou XMS ovládača. Pri EMS sa 16kB stránky primapovávajú do rozsahu 768kB - 960kB (a teda si tam môžeme pripojiť naraz až 192kB pamäte)
Každopádne EMS je podľa mňa jednoduchšie. Ak sa ale použijú nejaké knižnice, rozdiel v zložitosti môže byť zanedbateľný.

//autoeditácia príspevku ( 01 May 2009, 15:54 )
durkovicovic napísal:Ake velke polia? Mozes prosim trosku popisat ten program?
Ak máš v PC viac ako 32MB pamäte, tak tie polia môžu mať okolo 31MB (časť z tých 32MB využije samotný DOS).
Ak použiješ nejakú knižnicu, tak je viac menej jedno, či použiješ XMS, alebo EMS (netuším, koľko RAM sa dá použiť pri XMS).
ja to nebyl napísal:chrono respekt ! ak to mas niekde skus to upnut zislo by sa v buducnosti :)
Koho dnes trápi 16 bitová aplikácia pre DOS? :) (v "normálnom" operačnom systéme sa to dá urobiť oveľa jednoduchšie)
durkovicovic
Novice
Novice
Príspevky: 6
Registrovaný: 01 máj 2009, 12:07

Príspevok od používateľa durkovicovic »

chrono napísal:Pravda je (pravdepodobne) niekde uprostred.
Pri XMS sa tá pämať nad 1MB nedá používať priamo, dáta sa tam musia dávať pomocou XMS ovládača. Pri EMS sa 16kB stránky primapovávajú do rozsahu 768kB - 960kB (a teda si tam môžeme pripojiť naraz až 192kB pamäte)
Každopádne EMS je podľa mňa jednoduchšie. Ak sa ale použijú nejaké knižnice, rozdiel v zložitosti môže byť zanedbateľný.

//autoeditácia príspevku ( 01 May 2009, 15:54 )
Koho dnes trápi 16 bitová aplikácia pre DOS? :) (v "normálnom" operačnom systéme sa to dá urobiť oveľa jednoduchšie)
Ak by si to mohol upnut bol by som ti velmi velmi vdacny.
Ako je mozne vytvorit take velke polia? povodne som si myslel ze pole je obmedzene rozsahom pola na 32k zaznamov, neskor som to skusal obist ale nepodarilo sa mi to co moje presvedcenie len utvrdilo ze ak je nejaky postup ako vytvorit take velke pole, postup musi byt iny. A az dnes ste mi tu pripomenuli linearne zoznamy :oops:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Pole si môžeš vytvoriť (v podstate) ako koľvek veľké. Jediný problém potom je v tom, že s ním nemôžeš pracovať klasickým spôsobom. :)

Tu je približný popis, ako na to s použitím EMS:

0. Ak môžeš, urob to ako 32b program.

1. Zistíš, koľko prvkov budeš potrebovať a teda aj množstvo potrebnej pamäte. (ideálne by bolo, aby bola veľkosť prvkov taká, aby sa končili presne na hranici 16kB; ak bude prvok presahovať do dvoch stránok, nie je to problém, len sa to mierne skomplikuje)

2. Pomocou EMS si naalokuješ potrebný počet stránok (teda veľkosť potrebnej pamäte / 16kB)

3. Urobíš si funkciu, ktorá ti vráti adresu prvku. Funkcii dáš index prvku, ktorý potrebuješ a tá funkcia primapuje potrebný EMS segment a vráti ti adresu toho prvku. Pri triedení potrebuješ dva prvky, takže by bolo vhodné, aby si používal dve okná (aby sa ti po vyžiadaní druhého prvku nezmenili dáta pre ten prvý prvok). Ak použiješ dve okná (čo je kvôli výkonu lepšie riešenie), tak by funkcia mala mať ešte jeden parameter, v ktorom bude číslo použitého okna.

4. Porovnáš tie prvky a podľa potreby ich vymeníš.

5. A aby som nezabudol. Ak môžeš, použi radšej 32 bitovú verziu Pascal. :)

Tu sú nejaké funkcie z toho môjho programu:

Kód: Vybrať všetko

function GetEMSWindowSegment:Word; assembler;
asm
        MOV     AH,41h
        INT     67h
        TEST    AH,AH
        JE      @@1
        XOR     BX,BX
@@1:    MOV     AX,BX
end;

function FreeEMSPages:Word; assembler;
asm
        MOV     AH,42h
        INT     67h
        MOV     AX,BX
end;

function  AllocateEMSPages(Count:Word):Word; assembler;
asm
        MOV     AH,43h
        MOV     BX,Count
        INT     67h
        TEST    AH,AH
        JE      @@1
        XOR     DX,DX
@@1:    MOV     AX,DX
end;

procedure SetEMSPage(PageNumber, ObjectOffset, Handle:Word); assembler;
asm
        MOV     AX,PageNumber
        MOV     AH,44h
        MOV     BX,ObjectOffset
        MOV     DX,Handle
        INT     67h
end;

procedure DeallocateEMSPages(Handle:Word); assembler;
asm
        MOV     AH,45h
        MOV     DX,Handle
        INT     67h
end;
(ešte tam chýba funkcia na otestovanie, či je EMS povolené, ale tú som nerobil, keďže som ju nepotreboval; navyše tie funkcie cháp len ako ukážku, keďže pochybujem, že by si podľa nich vedel, ako sa majú používať a ja nemám DOS + Pascal, tak ti nemôžem napísať ukážkový program)
durkovicovic
Novice
Novice
Príspevky: 6
Registrovaný: 01 máj 2009, 12:07

Príspevok od používateľa durkovicovic »

dakujem, no aspon mam nejaku predstavu :) hmmm takyto assembler som veru necakal :) este k tomu polu, ako mozem vytvorit take velke pole? nech robim co chcem nijak mi to neprejde cez kompiler. aj keby mam vytvorit len 35k poloziek. Ak sa teda samozrejme nebavime o lin.zoznamoch.
btw: ani ja nemem dos+ pascal vsetko ide na dosbox+pascal
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Pod poľom si predstavujem prvky umiestnené za seba. Ako som už písal, budeš potrebovať funkciu, ktorá ti vráti adresu toho prvku, pretože, ako som tiež už písal, nemôžeš k tomu pristupovať ako k normálnemu poľu (Pascal pre DOS vie pristupovať len k polu, čo sa zmestí do jedného segmentu a teda musí byť menšie ako 64kB).

Inak tie funkcie by mohli byť urobené aj v Pascal (použili by sa tam funkcia intr, či ako sa volá).
inflater
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 470
Registrovaný: 28 mar 2007, 20:55
Bydlisko: Púchov, Slovakia

Príspevok od používateľa inflater »

Ľudze mojo, co sa tam srat s mrkvosoft vymyslami z dob 286 kedy si ludia upgradovali svoje 1MB masiny na 2MB? :D Je jasne ze z (cisteho) dosu max. 640kB nevytahnete, ale existuje takzvane unreal mode - keby som mal ten cas tak vam tu povypisujem kompletne rutiny ako z dosu pristupit ku stvrtemu gigabajtu RAM cez externy asembler TASM. Po vygoogleni, Alexei Frounze napisal rutiny pre tento unreal mode - jedna sa o prepnutie z realneho rezimu do chraneneho (protected), tam zmena limitov na segmenty z 640kB na 4GB a nas5 do realneho rezimu, ale nevim ci to bude fakcit pod winxp. A potom rovno cez external tasm funkcie co si prilinkujete k programu pristupujete priamo k RAMke, a nepotrebujete ziaden emm386, qemm, himem, cwsdpmi, dos4gw a podobnych veteranov. ;)

EMS je prezitok switchovania vselijakych poli alokovanej ramky a kadecoho este vsetkeho, a myslim ze viac nez 16 ci 32MB s nim nedosiahnete... a XMS to je onen slavny himem.sys.

Mno jo a ta 32bitova verzia "pascal" alias freepascal pouziva nejaky Delorieho extender, s tym je to jednoduksie ale vam to spravi aplikaciu velku jak hovado. Ale inac ist, to ide, cez cwsdpmi ;)

//edit: a ta lama co dala K-, odkazujem ak sa nelibi tak nech si prdel polibi. http://alexfru.chat.ru/programming/4gb.zip

ale pod windowsom neviem ci to pojde ;)
Napísať odpoveď