Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Out of data space? (QB)

Sivun loppuun

Gaxx [11.03.2004 16:41:26]

#

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?

tomaattigeeni [11.03.2004 17:32:23]

#

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.

Gaxx [11.03.2004 17:37:20]

#

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.

sqwiik [11.03.2004 18:33:29]

#

Se rajoitus on muuttujien kokonaismäärälle, ei yksittäisille taulukoille. Yksi string vie enemmän tilaa kuin integer.

Gaxx [11.03.2004 19:17:08]

#

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?

hunajavohveli [11.03.2004 20:36:52]

#

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.

Gaxx [11.03.2004 20:40:59]

#

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?

zacura [12.03.2004 11:45:50]

#

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

hunajavohveli [12.03.2004 14:21:54]

#

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.

Gaxx [12.03.2004 15:48:19]

#

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.

pieslice [13.03.2004 22:24:56]

#

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.

pieslice [13.03.2004 22:29:41]

#

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

Gaxx [14.03.2004 10:34:49]

#

Jepulis, kiitti tyhjentävästä vastauksesta!

pieslice [14.03.2004 12:58:34]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta