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
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.
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ä.
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?
Kun laittaa vaiks CLEAR ,,2000 ni se poistaa pinon rekisterin. toi 2000 on tavuja vai bitteija en tiiä
Se luulee sitä subiks/funktioks vaikkakin se muuttaa sen clear|in isoks.
Minkälaisia aliohjemia ohjelmassasi on? Sinun täytyy ehkä suunnitella ohjelman toiminta vähän toisella tavalla.
Eli siis nollaantuuko se pinomuisti jos palaa takaisin siihen pääohjelmaan(siis ei mikään subi)?
Ei nyt aivan nollaannu, mutta silloin siinä (pinomuistissa) ei ole enää ainakaan paluuhyppyjä.
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
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!
No eikös se subeissä itsestään olevilla END SUB käskyillä hoidu.
jaajoo tosiaan... En ollu ite koskaa ajatellu tollasta. Tosin oon ohjelmoinu qb:llä vasta vajaa pari viikkoa :)
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???
EXIT SUB
EXIT SUB. Missä tahansa kohdassa aliohjelmaa, lopettaa sen suorittamisen välittömästi.
Edit: Damn! Sekunnin myöhässä!
Joo... kiitti!
Aihe on jo aika vanha, joten et voi enää vastata siihen.