pascal rozsah pola
-
durkovicovic
Novice
- Príspevky: 6
- Registrovaný: 01 máj 2009, 12:07
pascal rozsah pola
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
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
-
durkovicovic
Novice
- Príspevky: 6
- Registrovaný: 01 máj 2009, 12:07
ano, viem, ale potrebujem to naozaj takto. Nie je to moje zadanie ale musi to tak byt.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ť).
diki za radu skusim ten obojsmerny linearny zoznamaudiotrack 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
-
durkovicovic
Novice
- Príspevky: 6
- Registrovaný: 01 máj 2009, 12:07
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 vzacnachrono 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)?
Co je to EMS, XMS?
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
-
ja to nebyl
Medium Expert
- Príspevky: 80
- Registrovaný: 27 jún 2008, 19:46
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).
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).
S čím presne si sa v Pascale nestretol?ja to nebyl napísal:podla mna to nie je mozne ...s takymto niecim som sa v pascale este nestretol
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
-
durkovicovic
Novice
- Príspevky: 6
- Registrovaný: 01 máj 2009, 12:07
Ake velke polia? Mozes prosim trosku popisat ten program?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).
-
ja to nebyl
Medium Expert
- Príspevky: 80
- Registrovaný: 27 jún 2008, 19:46
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 )
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).
(v "normálnom" operačnom systéme sa to dá urobiť oveľa jednoduchšie)
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 )
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).durkovicovic napísal:Ake velke polia? Mozes prosim trosku popisat ten program?
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).
Koho dnes trápi 16 bitová aplikácia pre DOS?ja to nebyl napísal:chrono respekt ! ak to mas niekde skus to upnut zislo by sa v buducnosti
-
durkovicovic
Novice
- Príspevky: 6
- Registrovaný: 01 máj 2009, 12:07
Ak by si to mohol upnut bol by som ti velmi velmi vdacny.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)
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
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:(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)
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;
-
durkovicovic
Novice
- Príspevky: 6
- Registrovaný: 01 máj 2009, 12:07
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
btw: ani ja nemem dos+ pascal vsetko ide na dosbox+pascal
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á).
Inak tie funkcie by mohli byť urobené aj v Pascal (použili by sa tam funkcia intr, či ako sa volá).
Ľudze mojo, co sa tam srat s mrkvosoft vymyslami z dob 286 kedy si ludia upgradovali svoje 1MB masiny na 2MB?
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
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