[qbasic] Een array in een bestand zetten

Pagina: 1
Acties:

  • Krankenstein
  • Registratie: Augustus 2000
  • Laatst online: 17-05 12:04
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?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 02:18

Gerco

Professional Newbie

Natuurlijk:
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!


  • Krankenstein
  • Registratie: Augustus 2000
  • Laatst online: 17-05 12:04
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?

Verwijderd

Maar nu ben ik toch wel erg benieuwd wat je nog met QBasic aan het maken bent :).

  • Krankenstein
  • Registratie: Augustus 2000
  • Laatst online: 17-05 12:04
* Krankenstein is een besturingsprogramma voor een robot aan het maken :7

Plaatje:
Afbeeldingslocatie: http://www.endoria.net/upload/index.php/1281031904
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" :P) 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 >:)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 02:18

Gerco

Professional Newbie

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

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Krankenstein
  • Registratie: Augustus 2000
  • Laatst online: 17-05 12:04
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.

  • Krypt
  • Registratie: April 2000
  • Laatst online: 07-09 16:35
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)

Pvouput live


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 09:02

Knutselsmurf

LED's make things better

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 -


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09-09 19:23

Dido

heforshe

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 / 8) + 1, y-coordinaat) && ((x-coordinaat MOD 8) ^ 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)

Wat betekent mijn avatar?


  • Krankenstein
  • Registratie: Augustus 2000
  • Laatst online: 17-05 12:04
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?

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.
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