Aika harvinaista varmaan, mutta pitäis saada tällänen koodinpätkä kunnolla toimimaan...
PRINT "Ladataan Katalookintekoohjelmaa..." TYPE ruutu merkki AS STRING * 1 etuvari AS INTEGER takavari AS INTEGER END TYPE TYPE sivu ruudut(2000) AS ruutu sivunumero AS INTEGER kaytossa AS STRING * 1 END TYPE TYPE katalooki sivut(50) AS sivu nimi AS STRING * 1 END TYPE PRINT "Tämän ohjelman on tehnyt Mikael Kasimir Harvilahti." SLEEP 2 CLS
Se bugittaa tossa "sivut(50) AS sivu"-kohdassa että RAM (tai mikä onkaan) ei riitä. Miten siis saadaan varattua ohjelmalle enemmän käyttömuistia käytettäväksi? (Tarvitsisin ainakin 50 sivua katalookiin)
-PC-Master-
Post Scriptum:
Ja voisko joku samalla kertoa miten saadaan lisättyä viestipätkään se sininen tausta?
"sivut(50) AS sivu" mieluummin vaikka muotoon "sivut(50) AS INTEGER" ja eiköhän ala pelittämään. Sinisen taustan saat COLOR - komennon avulla tyyliin COLOR 7, 1. Eka on tekstin väri, joka on nyt harmaa. Toinen on taustan väri, joka on sininen. Jos haluat koko näytön taustan siniseksi, laitahan COLORin jälkeen CLS. Muuta?
-Grey-
Ilmeisesti kaikki sivut eivät mahdu olemaan muistissa kerrallaan. Tee vaikka niin, että pidät yhtä sivua aina muistissa ja loput on tallennettu tiedostoon. Kannattaa käyttää binääritiedostoa, sinne tietueet saa laitettua vaivattomasti.
lainaus:
"sivut(50) AS sivu" mieluummin vaikka muotoon "sivut(50) AS INTEGER" ja eiköhän ala pelittämään.
Ei tässä tapauksessa ole aivan toimiva ratkaisu, sillä tuossa tahdotaan käyttää omaa tyyppiä. Integeriin on aika vaikea sijoittaa dataa 2000 ruudun verran... ;-D
Type sivussa on ainakin tuo sivunumero aika turha. (esim. sivut(x).kaytossa=0, x kertoo jo tuon sivunumeron). Jos et aivan välttämättä tarvitse tuota kaytossa-systeemiäkään (jos en aivan väärin käsittänyt, niin tarkoitat tuolla sitä, että se kertoo sen sivun, mikä tällä hetkellä näytetään ruudulla. Käytä mieluummin jotain erillistä muuttujaa kertomaan sen...) Sitten periaatteessa pystytkin korvaamaan sivut (50) as sivu -> sivut (50,2000) as ruutu
Myös ruutujen määrää voisi vähentää, kun nykyinen näyttäisi olevan 2000. Ylimmälle riville voisi esim. sijoittaa kataloogin nimen (jolle kannattaa vähän pidempi nimi varata kuin 1 merkin nimi ;-D ).
Jees, innostuin pitkälti kirjoittamaan, mutta toivottavasti auttaakin... jos tuosta nyt sai selvää ;-D
lainaus:
Post Scriptum:
Ja voisko joku samalla kertoa miten saadaan lisättyä viestipätkään se sininen tausta?
Öööh? Eikös tuo nyt yritä varata sivut(50) as sivu, jossa on ruudut(2000) as ruutu, ja ruudussa on vielä kolme muuttujaa, jotka lisäävät sen kokoa aika paljon, jolloin niiden yhteiskoko olisi 50 * 2000 * 3 + risat = 300000 + risat, ja QBasicin rajoitus on muistaakseni 64 kt, kun tässä yritetetään lähes 300 kt!
Kertokaa, jos tässä selityksessäni on jotain vialla.
TYPE ruudun koko = 1 * 1 + 2 * 4 = 9 tavua
TYPE sivun koko = 2001 * 9 + 1 * 4 + 1 * 1 = 18014
TYPE katalookin koko = 51 * 18014 + 1 * 1
--
Koko yhteensä 918715 tavua eli 897,1826171875 kilotavua. Ehkä?
Muokkausa: unohtui tuolta tuo kilo-etuliite (ATK-tunti, piti osallistua tiedonhakukisaan niin vastan nopeasti)
Mistä tuo ruudun koon 1 * 1 + 2 * 4 tavua tulee? Eikös integerit vie 2 tavua ja stringit, joiden pituus on määritelty 1 tavu/merkki? eli se ruudun koko olisi kai 1 * 1 + 2 * 2 = 5 tavua.
Sivun koko olisi 2001 * 5 + 1 * 2 + 1 * 1 = 10008 tavua
katalookin kooksi tulisi kaiketi 51 * 10008 + 1 * 1 = 510409 tavua = noin 500 kilotavua.
Taaskin saattoi mennä jotain pieleen, mutta jos tämä olisi ainakin lähempänä totuutta kuin tuo edellinen...
Hmm.. ovatkos ne sittenkin kaksi-tavuisia. Ekäpä sitten. No, joka tapauksessa se vie tuolla tavoin aivan liikaa muistia.
On ne kaksitavuisia. LONG- ja SINGLE-muuttujat ovat 4-tavuisia (myös tyhjät vaihtuvamittaiset merkkijonomuuttujat vievät 4 tavua)
EDIT: korjattu kirjoitusvirhe...
Helpoiten muuttujan koko selviää LEN-funktiolla. Jos tekee yhden sivu-tyyppisen muuttujan, QB ilmoittaa sen vievän 10008 tavua muistia. Näin ollen 51 sivua ja yhden merkin pituinen merkkijono veisivät 10008 * 51 + 1 eli 510409 tavua. Sami laski tarkalleen oikein!
Ei kai sitä väärinkään kannata laskea ;)
Miksi noita ruutuja luodaan noin älytön määrä? sitä kun pienentää niin tilantarvekin pienenee paljon hyvinkin nopeasti.
Arvatenkin jokaista näytön merkkiä vastaa yksi ruutu-tietue (80 x 25 = 2000), joka sisältää paitsi merkin myös sen värin ja taustavärin. Tosin kahdelle alimmalle riville ei voi tulostaa QB:n keinoin. Lisäksi pari riviä yläreunasta tai alareunasta kannattaisi jättää tilaa mahdollisille muille tiedoille, kuten sivunumeroille ja näppäinkomennoille.
Hieman hitaampi siitä tulisi, mutta toimiva, jos tiedot tallennetaan jonnekin tiedostoon ja luetaan sieltä muuttujiin aina tarvittaessa.
Jokaiselle sivulle voisi olla oma tiedostonsa esim. sivu0001.kat, sivu0002.kat...
Tällöin sivuja voisi olla lähes rajoittamaton määrä, ja muistiin tarvitsisi ottaa kerrallaan 10000 tavua tietoa. (jos etu- ja taustaväri pakataan yhteen string * 1-muuttujaan, saataisiin se menemään 4000 tavuun.)
lainaus:
Tosin kahdelle alimmalle riville ei voi tulostaa QB:n keinoin.
Eikö muka? Voihan!!
lainaus:
lainaus:
Tosin kahdelle alimmalle riville ei voi tulostaa QB:n keinoin.
Eikö muka? Voihan!!
Ei voi, ellet sitten kopioi jossain vaiheessa fonttia talteen ja myöhemmin piirtele niitä sinne alas PSETillä, sillä jos käytät PRINTiä niin se scrollaa sitä ruutua automaattisesti.
No, kyllä se tekstitilassakin onnistuu. Silloin täytyy tosin kajota suoraan muistiin ja PRINT:in tai vastaavien käyttäminen ei ole mahdollista. Tekstitilassa näytön sisältö löytyy muistiosoitteesta &HB800 alkaen sisältäen aina kaksi tavua per merkki: merkin koodi ja väri. POKE:lla niitä merkkejä sitten voi lukea ja muuttaa. Toivottavasti tämä esimerkki hyödyttää jotakuta:
'tekstinäytön muistisegmentti DEF SEG = &HB800 'tyhjennetään näyttö CLS 'kohta, johon tulostus aloitetaan a% = 80 * 24 * 2 - 2 'tulostettava teksti t$ = "Alimmalla rivillä ollaan!" 'kirjoitetaan merkkijono merkki kerrallaan muistiin FOR i = 1 TO LEN(t$) POKE a% + i * 2, ASC(MID$(t$, i)) NEXT 'odotetaan näppäimenpainallusta SLEEP
Jos oikein pilkkua viilataan, niin tekstitilassa näytön sisältö alkaa muistiosoitteesta B8000. Segmentoidulla arkkitehtuurillahan homma menee niin että: addr = segment * 16 + offset
Tuo tausta ja etuväri vie aika paljon kyllä tilaa, mutta tietäisikö joku voisiko QB:llä jotenkin rajoittaa INTEGERin numerot neljästä nollaan? Sillä tavalla se voisi viedä vähemmän tilaa, jos vastaus olisi laittaa se jotenkin binääriksi, niin yhteen tavuunhan voisi pakata etu- ja takavärit! (Itse nimittäin en osaa)
-PC-Master-
QB:ssä ei ole varsinaisesti tavun kokoista muuttujaa, mutta STRING * 1 ajaa saman asian. Luku pitää aina välillä muuttaa merkiksi, jotta se mahtuu muuttujaan. Tässä vähän koodia:
'yhden tavun kokoinen tekstimuuttuja DIM vari AS STRING * 1 'värien määrittely vari1 = 12 vari2 = 8 'värien pakkaaminen muuttujaan vari = CHR$((vari1 AND 15) * 16 OR (vari2 AND 15)) 'värien palauttaminen pakatusta muuttujasta vari1 = (ASC(vari) \ 16) AND 15 '12 vari2 = ASC(vari) AND 15 '8
Katso myös: https://www.ohjelmointiputka.net/koodivinkit/
Kiitti! Ja koska mä oon tehny omaan ohjelmaani tälläisiä muutoksia...:
TYPE ruutu merkki AS STRING * 1 etuvari AS INTEGER takavari AS INTEGER END TYPE TYPE sivu ruudut(1500) AS ruutu sivunumero AS INTEGER kaytossa AS STRING * 1 END TYPE TYPE katalooki sivut(13) AS sivu nimi AS STRING * 1 END TYPE CLS
...niin tähän saa vielä enemmän sivuja! Jahuu!!!
Mä en ole ihan varma tästä koodinpätkien sivut-indexistä ja ruudut-indexistä...olen koulun koneella.
Mut kyllä ainakin muiden juttujen pitäis täsmää!
-PC-Master-
Aihe on jo aika vanha, joten et voi enää vastata siihen.