Ik heb een programmatje en eigenlijk wil ik daarin een array van 640*480 hebben. Dat kan echter niet omdat een array maximaal 64kb groot mag zijn. Anders zou ik dus ongeveer 20 array's moeten maken, maar daar heb ik niet zo'n zin in. Is het ook mogelijk om zonder beperkingen een bestand te gebruiken in plaats van het geheugen?
Natuurlijk:
Disclaimer: QB was een tijd geleden...
Als je trouwens gewoon een stuk geheugen wilt gebruiken ipv een array, dan kun je zonder problemen de DOS API gebruiken om dat te reserveren enzo, VarPtr ernaartoe en je kunt er een hoop mee. Als 64k niet groot genoeg is voor je, kun ja altijd nog XMS of EMS gebruiken.
1 of andere lib (DirectQB geloof ik) maakt dat soort dingen erg makkelijk, zoek er ff op met Google en je vind 'em vast wel.
code:
1
2
3
4
5
| OPEN bestand.dat FOR BINARY ACCESS READ WRITE AS 1 GET #1, <vars> SEEK #1, 1024 PUT #1, <vars> CLOSE 1 |
Disclaimer: QB was een tijd geleden...
Als je trouwens gewoon een stuk geheugen wilt gebruiken ipv een array, dan kun je zonder problemen de DOS API gebruiken om dat te reserveren enzo, VarPtr ernaartoe en je kunt er een hoop mee. Als 64k niet groot genoeg is voor je, kun ja altijd nog XMS of EMS gebruiken.
1 of andere lib (DirectQB geloof ik) maakt dat soort dingen erg makkelijk, zoek er ff op met Google en je vind 'em vast wel.
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!
Thnx, maar kun je wat meer uitleggen over dat geheugen reserveren met die dos api? Als een ik een stuk geheugen van 640*480 zou willen reserveren, dan zou dat ongeveer 300kb worden. Dat zou moeten kunnen met de 640kb die je voor dit soort dingen tot je beschikking hebt, of heb ik dat fout?
Het EMS/XMS aanspreken wordt al gelijk een stuk lastiger heb ik het idee. Klopt dat?
Het EMS/XMS aanspreken wordt al gelijk een stuk lastiger heb ik het idee. Klopt dat?
* Krankenstein is een besturingsprogramma voor een robot aan het maken 
Plaatje:

Dit is nog maar een beginstadium. Nu issie al een stuk uitgebreider.
Maar daar moet dus een programma bij. Die array is om de kaart in vast te leggen. Als de robot namelijk rondrijdt en hij rijdt ergens tegenaan, dan moet 'ie een obstakel registreren en onthouden (onder het motto "een ezel stoot zich geen twee keer aan dezelfde steen"
) en dat moet dus in die array komen te staan. Er moeten 3 verschillende waardes in komen:
-onverkend
-verkend maar geen obstakel
-obstakel
Zo moet 'ie uiteindelijk een soort kaartje produceren van de omgeving.
P.S. Lego roeleert
Plaatje:
Dit is nog maar een beginstadium. Nu issie al een stuk uitgebreider.
Maar daar moet dus een programma bij. Die array is om de kaart in vast te leggen. Als de robot namelijk rondrijdt en hij rijdt ergens tegenaan, dan moet 'ie een obstakel registreren en onthouden (onder het motto "een ezel stoot zich geen twee keer aan dezelfde steen"
-onverkend
-verkend maar geen obstakel
-obstakel
Zo moet 'ie uiteindelijk een soort kaartje produceren van de omgeving.
P.S. Lego roeleert
Ik heb ergens een progje waar dat soort zaken allemaal instaan, maar ik denk dat het beter voor je is om DirectQB op te zoeken (dan heb je gelijk geen last meer van de 640KB
)
Het progje heet helppc en bevat documentatie voor (bijna) alle DOS interrupts, structures en datatypen. Verder ook een complete 80386 ASM instructieset + documentatie.
Helppc kun je hier neerhalen en DirectQB staat hier.
Geheugenfuncties voor DOS zitten in int21h, functies 48h,49h en 4ah
Het progje heet helppc en bevat documentatie voor (bijna) alle DOS interrupts, structures en datatypen. Verder ook een complete 80386 ASM instructieset + documentatie.
Helppc kun je hier neerhalen en DirectQB staat hier.
Geheugenfuncties voor DOS zitten in int21h, functies 48h,49h en 4ah
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!
Thnx maar is het implementeren van DirectQB niet net zo ingewikkeld als een stukje code schrijven om het EMS aan te sturen? Ik heb er niet zoveel verstand van maar ik zal de manual van DirectQB eens doorlezen.
Hmm. EMS en XMS calls met Interrupts.. kan me nog iets herinneren daarvan..
Helaas heeft Qbasic geen standaard Interrupt Call, en moet je dus met Call Absolute gaan werken.. en daar kan je dus niet standaard Interrupts mee aanroepen..
Moet je eens op internet zoeken naar de Qbasic programmatjes van PcActive.. Daar staat een source in waarmee een eigen Interrupt.X subroutine wordt beschreven waarmee je in Qbasic naar hartelust Interrupt calls kan aanmaken... (Of even opzoek gaan naar Qb 4.5 of QBx)
Ik zal wel even zoeken naar de Interrupt Calls, ik heb een keertje een EMS-copy gemaakt die 16MB aan data in het EMS plakte en daarna weer terug kopieerde.. volgens mij heb ik dat nog ergens liggen hoop ik..
[edit]
Hmm. backuptapeje is dood
Maar dit is ook wel wat denk ik: Ditte dus
Hier ergens gevolden
Ik denk toch dat je beter kan gaan zoeken naar Qb4.5 of Qbx (PDS 7.x)
Helaas heeft Qbasic geen standaard Interrupt Call, en moet je dus met Call Absolute gaan werken.. en daar kan je dus niet standaard Interrupts mee aanroepen..
Moet je eens op internet zoeken naar de Qbasic programmatjes van PcActive.. Daar staat een source in waarmee een eigen Interrupt.X subroutine wordt beschreven waarmee je in Qbasic naar hartelust Interrupt calls kan aanmaken... (Of even opzoek gaan naar Qb 4.5 of QBx)
Ik zal wel even zoeken naar de Interrupt Calls, ik heb een keertje een EMS-copy gemaakt die 16MB aan data in het EMS plakte en daarna weer terug kopieerde.. volgens mij heb ik dat nog ergens liggen hoop ik..
[edit]
Hmm. backuptapeje is dood
Maar dit is ook wel wat denk ik: Ditte dus
Hier ergens gevolden
Ik denk toch dat je beter kan gaan zoeken naar Qb4.5 of Qbx (PDS 7.x)
Hmmm, 640*480. Kan je niet stiekim je videogeheugen gebruiken voor het onthouden van de obstakels? Heb je direct een kaart van de omgeving op je scherm
- This line is intentionally left blank -
Een array met bits: 0=onverkend, 1=verkend
Een array met bits: 0=leeg , 1=obstakel
Arrays kun je definieren als 80 x 480, 1 byte lang
vervolgens bits testen als
VERKEN_TAB(int(x-coordinaat /
+ 1, y-coordinaat) && ((x-coordinaat MOD
^ 2)
Hierbij is && een LOGISCHE IF op biniveau (dat kan zeker met QB, maar je ff kijken of dat && is...
Tweede array is alleen van belang als eerste array op 1 staat...
Beide arrays zijn nu 37.5Kb groot, dat past prima!
(Check die formule wel ff, want ik schrijf 'm nu heel snel uit 't koppie op, meestal moet er dan nog wel iets aan versteuteld worden)
Een array met bits: 0=leeg , 1=obstakel
Arrays kun je definieren als 80 x 480, 1 byte lang
vervolgens bits testen als
VERKEN_TAB(int(x-coordinaat /
Hierbij is && een LOGISCHE IF op biniveau (dat kan zeker met QB, maar je ff kijken of dat && is...
Tweede array is alleen van belang als eerste array op 1 staat...
Beide arrays zijn nu 37.5Kb groot, dat past prima!
(Check die formule wel ff, want ik schrijf 'm nu heel snel uit 't koppie op, meestal moet er dan nog wel iets aan versteuteld worden)
helaas pikt 'ie 80x480 ook al niet. Maar in theorie zou 40x480 al genoeg moeten zijn denk ik, aangezien een integer uit 16 bits bestaat. Of zijn er daar standaard 8 een nul?
Dat sommetje snap ik eigenlijk niet zo. Zou je daar wat toelichting op kunnen geven?
En er is zeker geen korter variabel dan de integer? Want die neemt zoals gezegd 16 bits in, wat nog best veel is. Hoeveel bits neemt een string van 1 character in?
Dat sommetje snap ik eigenlijk niet zo. Zou je daar wat toelichting op kunnen geven?
En er is zeker geen korter variabel dan de integer? Want die neemt zoals gezegd 16 bits in, wat nog best veel is. Hoeveel bits neemt een string van 1 character in?
Verwijderd
ik heb nog wel ergens QB4.5 liggen(zonder hlp file).
maar anders schrijf het weg in een file.
ga een map tekenen in een bestand en lees dat ook weer in.
stel dit is je file
en een O is je robot
dan moet je dit alleen inlezen, dat scheelt gehegen(is wel traager, maar je kan niet alles hebben)
maar anders schrijf het weg in een file.
ga een map tekenen in een bestand en lees dat ook weer in.
code:
1
2
3
4
5
6
7
8
| xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxOxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx |
stel dit is je file
en een O is je robot
dan moet je dit alleen inlezen, dat scheelt gehegen(is wel traager, maar je kan niet alles hebben)
code:
1
2
3
4
5
| xxxxxxx xxxxxxx xxxOxxx xxxxxxx xxxxxxx |
Pagina: 1