Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB muuttujia liian paljon

Sivun loppuun

InvalidCo [06.05.2003 17:08:31]

#

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?

Grey [06.05.2003 18:07:16]

#

"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-

Antti Laaksonen [06.05.2003 18:16:24]

#

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.

Vilikki [06.05.2003 21:22:54]

#

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

trinit [06.05.2003 21:32:38]

#

lainaus:

Post Scriptum:
Ja voisko joku samalla kertoa miten saadaan lisättyä viestipätkään se sininen tausta?

https://www.ohjelmointiputka.net/ohje.php?tunnus­=kohjeet

Sami [06.05.2003 22:34:03]

#

Ööö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.

arcatan [07.05.2003 08:32:20]

#

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)

Sami [07.05.2003 11:52:52]

#

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

arcatan [07.05.2003 15:58:06]

#

Hmm.. ovatkos ne sittenkin kaksi-tavuisia. Ekäpä sitten. No, joka tapauksessa se vie tuolla tavoin aivan liikaa muistia.

Sami [07.05.2003 20:06:08]

#

On ne kaksitavuisia. LONG- ja SINGLE-muuttujat ovat 4-tavuisia (myös tyhjät vaihtuvamittaiset merkkijonomuuttujat vievät 4 tavua)

EDIT: korjattu kirjoitusvirhe...

Antti Laaksonen [07.05.2003 20:50:20]

#

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!

Sami [07.05.2003 21:00:44]

#

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.

Antti Laaksonen [07.05.2003 22:16:23]

#

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.

Sami [07.05.2003 22:35:17]

#

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

Tatu Peltola [12.05.2003 20:48:01]

#

lainaus:

Tosin kahdelle alimmalle riville ei voi tulostaa QB:n keinoin.

Eikö muka? Voihan!!

Sami [12.05.2003 20:58:34]

#

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.

Antti Laaksonen [12.05.2003 21:14:12]

#

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

thefox [12.05.2003 21:19:26]

#

Jos oikein pilkkua viilataan, niin tekstitilassa näytön sisältö alkaa muistiosoitteesta B8000. Segmentoidulla arkkitehtuurillahan homma menee niin että: addr = segment * 16 + offset

InvalidCo [14.05.2003 15:38:29]

#

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-

Antti Laaksonen [14.05.2003 15:58:42]

#

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/23605-qb-kahden-värin-pakkaaminen-yhteen-tavuun

InvalidCo [30.05.2003 15:23:23]

#

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-


Sivun alkuun

Vastaus

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

Tietoa sivustosta