Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: kumma errori

Sivun loppuun

Gaxx [02.12.2003 22:34:49]

#

Mitä on vialla kun rämppään kahden funktion välillä (tai itseasiassa komen siis ekasta meen tokaan painamalla ja tokasta kolmanteen painamalla ja sitten komannesta ykköseen automaattisesti)niin jonkun reilu kymmenen kerran jälkeen se ilmottaa jonkun "out of stack space" errorin???
Tarkoitan siis, että ramppaan tekemässäni ohjelmassa (eli suoritan sitä).
ps QB:ssa

sqwiik [03.12.2003 00:04:12]

#

Johtuu seuraavasta: aina kun ohjelma hyppää toiseen aliohjelmaan, edellisen suorituskohdan sijainti talletetaan pinomuistiin. Ja kun aliohjelma saatetaan loppuun, palataan muistiin talletettuun paikkaan koodissa. Vika löytyy nyt koodaajasta :(

Katsos:
suoritus hyppää ao 1:n ja laittaa ohjelmakohdan muistiin.
suoritus hyppää ao 2:n ja - | | -
suoritus hyppää ao 3:n ja - | | -
suoritus hyppää ao 1:n ja - | | -
jne jne jne kunnes pinomuisti ei enää riitä tallettamaan sijaintia.

Sinun pitää muuttaa ohjelman rakennetta niin, ettei synny ikuista hyppelyä aliohjelmasta toiseen.

hunajavohveli [03.12.2003 12:49:06]

#

Eli toisin sanoen, täytyy poistua edellisesti aliohjelmasta ennen siirtymistä toiseen. Voi hemmetti tuli justiin mieleen kuinka olin pari vuotta sitten aloittanut erään isomman luokan peliprojektin. Olin silloin varsin innokas GOTO:n käyttäjä (mikä painajainen) ja sitten QBasicista loppui pääohjelma muisti ja joudun siirtämään kaiken Subbeihin. Sitä takkuamista en ole saanut vieläkään valmiiksi. Törmäsiin samaan ongelmaan kuin Gaxx ja tein todella ihmevirityksen selvitäkseni siitä.

Gaxx [03.12.2003 15:08:21]

#

Jaha... jaha... eikö tätä pinomuistia pysty vapauttamaan millään keinolla (esim jollain komennolla)? Ja mites siitä aliohjelmasta poistutaan ENNEN kuin siirrytään toiseen? Onko siihen joku (oma) komento?

rndprogy [03.12.2003 15:08:36]

#

Kun laittaa vaiks CLEAR ,,2000 ni se poistaa pinon rekisterin. toi 2000 on tavuja vai bitteija en tiiä

Gaxx [03.12.2003 15:15:26]

#

Se luulee sitä subiks/funktioks vaikkakin se muuttaa sen clear|in isoks.

Antti Laaksonen [03.12.2003 15:33:45]

#

Minkälaisia aliohjemia ohjelmassasi on? Sinun täytyy ehkä suunnitella ohjelman toiminta vähän toisella tavalla.

Gaxx [03.12.2003 15:58:10]

#

Eli siis nollaantuuko se pinomuisti jos palaa takaisin siihen pääohjelmaan(siis ei mikään subi)?

sqwiik [03.12.2003 20:34:23]

#

Ei nyt aivan nollaannu, mutta silloin siinä (pinomuistissa) ei ole enää ainakaan paluuhyppyjä.

Antti Laaksonen [03.12.2003 20:57:32]

#

Vapaan pinomuistin määrän voi selvittää FRE-funktiolla, kun parametri on -2. Testasin hieman asiaa, ja näyttää siltä, että pinomuistia ei pääohjelmaan palatessa vapaudu mutta aliohjelma voi käyttää samaa pinomuista aina uudestaan.

DO
   PinoTesti 1
LOOP

SUB PinoTesti (k%)
   PRINT SPACE$(k%); "Kerros"; k%; "- pinomuistia jäljellä"; FRE(-2)
   SLEEP
   IF k% < 5 THEN
      PinoTesti k% + 1
   END IF
   PRINT SPACE$(k%); "Kerros"; k%; "- pinomuistia jäljellä"; FRE(-2)
   SLEEP
END SUB

Gaxx [03.12.2003 21:45:11]

#

Joo... toi on hyvä tietää, että sitä voi käyttää uudestaa.
Sitten olis vielä yks, että onko mitään komentoa, jolla voisi sulkea kaikki subit ja palata suorittamaan pää ohjelmaa(alusta tai siitä mihin jäätiin)?
Kiitokset avusta!

rndprogy [03.12.2003 22:28:33]

#

No eikös se subeissä itsestään olevilla END SUB käskyillä hoidu.

Gaxx [03.12.2003 22:46:46]

#

jaajoo tosiaan... En ollu ite koskaa ajatellu tollasta. Tosin oon ohjelmoinu qb:llä vasta vajaa pari viikkoa :)

Gaxx [04.12.2003 17:43:26]

#

Hmm... taisi tulla väärinkäsitys, sillä tarkoitin, että millä pystyy lopettaan subin missätahansa vaiheessa(se end sub pitää olla aliohjelman lopussa). Eli siis kuka tietää jotain tällaisesta vai onko sellasta edes? Vai onko siinä pakko käyttää GOTOa???

sooda [04.12.2003 17:46:52]

#

EXIT SUB

sqwiik [04.12.2003 17:46:53]

#

EXIT SUB. Missä tahansa kohdassa aliohjelmaa, lopettaa sen suorittamisen välittömästi.

Edit: Damn! Sekunnin myöhässä!

Gaxx [04.12.2003 17:51:24]

#

Joo... kiitti!


Sivun alkuun

Vastaus

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

Tietoa sivustosta