Dimmailen ohjelmassani seuraavan laisesti:
DIM SHARED Xsize AS INTEGER, Ysize AS INTEGER DIM SHARED action(80, 60) AS STRING DIM SHARED texture(80, 60) AS STRING DIM SHARED map(80, 60, 3) AS STRING
Ongelma on siis, että ei mene läpi. Kääntäjä herjaa tokalla rivillä, että "Out of data space". Onko stringien tilan varauksessa jotkut omat rajotuksensa? Vai mikä on?
Suomeksihan tuo on yksinkertaisesti "Muisti ylitetty", ja tosiaan QB:ssä noiden taulukoiden koko on rajoitettu, lukuja en tiedä mutta ilmeisesti tässä tapauksessa mennään yli kokorajasta.
Mutta ton texture(80, 60) taulukon kokohan on sama kun action(80, 60). Miksei se siitä valita? Se rajotushan on 64kt/muuttuja ja noi oli aluks integerejä muut paitti toi texture(80, 60), mutta kun oli helpompi ohjelmoida stringeinä niin päätin muuttaa ne stringeiksi.
Se rajoitus on muuttujien kokonaismäärälle, ei yksittäisille taulukoille. Yksi string vie enemmän tilaa kuin integer.
lainaus:
Se rajoitus on muuttujien kokonaismäärälle, ei yksittäisille taulukoille.
Kappas nii onki :)
No täytyy kai sitte tehä se vaikeemman kautta :(
Edit: onko tietoo paljonko sellanen stringi vie peruksena muistia, että se menis kääntäjästä läpi?
Itse asiassa yksi STRING ei vie enempää kuin yksi INTERGER, vaan merkki vie yhden ainoan tavun, mutta tuossa ei ole määritelty STRING:n pituutta, joten yhteen alkioon voi periaattessa tallentaa vaikka minkä pituisen merkkijonon. Jos taulukkoon on joka kohtaan tarkoitus tallentaa vain yksi merkki, niin tee alustus näin:
DIM SHARED texture(80, 60) AS STRING * 1
Tuo vie paljon vähemmän muistia. Ja sen takia muisti loppuu vasta toisessa (80,60)-taulukossa, koska ensimmäisen taulukon vaatima tila mahtuu vielä muistiin, mutta ei enää seuraavan.
lainaus:
DIM SHARED texture(80, 60) AS STRING * 1
Ai siihen tulee kertomerkki :) Ihmettelinkin, kun yritin säätää niille pituutta, että miksei toimi.
Kiitti, nyt pitäs riittää muisti.
Edit: Jos saanen esittää kysymyksen, joka on pitkään kismittänyt minua mutta ei vain ole tullut kysytyksi, vaikka meneekin vähän offtopiciksi niin minkä takia QB:ssä yleensäkkään on koko 64kt:n rajotusta? Onko tämä jokin M$:n OUTO ratkaisu muuten vaan rajottaa muistin käyttöä vai onko se jostain teknisestä syystä vai onko olemassa jokin muu syy?
Muuttamalla taulukot dynaamisiksi saa käyttöön kaiken vapaan perusmuistin.
Koodin alkuun:
REM $DYNAMIC
ja käynnistä qb parametreilla /ah (muistaakseni, kannattaa katsoa qb ohjeista).
Joo
REM $DYNAMIC
tai sitten
'$DYNAMIC
Eikö tuo /ah anna mahdollisuuden ylitää 64 Kilotavun muistin tai jotain. Ainakin subscriptit tulee vastaan, jos pistää pelkän $DYNAMIC:n.
No mää tiesin noi jo ennestään mutta ku ne bugaa jotenki oudosti aina välillä ni en oo halunnu käyttää. Tosin mua ihmetyttää edelleenki miks se 64kt:n raja on yleensäkkään olemassa.
lainaus:
No mää tiesin noi jo ennestään mutta ku ne bugaa jotenki oudosti aina välillä ni en oo halunnu käyttää. Tosin mua ihmetyttää edelleenki miks se 64kt:n raja on yleensäkkään olemassa.
no sen dossin takia. eli 8/16 bittisissä prosessoreissa ei voinut osoittaa koko muistia yhdellä pointterilla vaan se piti jakaa segmentteihin, jotka ovat 64kb kokoisia, joten muistia voitiin osoittaa segmentti(0-255)::offset(0-65535)
tavalla, jolloin koko muistiin päästiin (ja päästään edelleenkin ensimmäisessä megassa, jossa tämä sääntö pätee) käsiksi. tämä sitten jäi, koska PC-prossut on suunniteltu alaspäin yhteensopivaksi. myöhemmin, kun 32-bittiset prosessorit tulivat, voitiin koko muisti osoittaa yhdellä 32-bittisellä pointterilla, ja tämä on nk. suojattu tila, eg. 32-bittinen tila, jossa Windowskin toimii.
teoriassahan sen arrayn koko voisi olla >64kb, mutta silloin sen osoittamiseen tarvitaan useita pointtereita, ja QB kääntäjää ei ole suunniteltu siten, koska se on tehty vuonna 1987, jolloin tollasille ei ollu tarvetta.
/ah tarkoittaa sitä, että ohjelman muistimalli on HUGE, eli data voi olla >64kb.
'$dynamic taas tarkoittaa että data liikkuu muistissa, eli sen pointterit vaihtuu koko ajan, ja muistia pakataan jotenkin siten että sinne jää mahd. isoja vapaita lohkoja. ilmeisesti.
Jepulis, kiitti tyhjentävästä vastauksesta!
ei se '$dynamic kyllä ole aiheuttanut mulle koskaan mitään päänvaivaa. mutta en kyllä koskaan aja ohjelmiani QB:n kautta vaan käännän ne ja ajan command promptista valmiin exen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.