Jatkuu edellisestä.
Eli onko QB:ssä arrayta tai voiko sellaisia mestaroida jotenkin? Miten voi selvittää, montako numeroa on single-muuttujassa (esim. luvussa 10000 on viisi numeroa)? Miten voi tulostaa jostakin muuttujasta vain tietyn verran kirjaimia (esim. muuttujasta, jonka sisältö on "SANOJA", tulostetaan vain viisi kirjainta, eli "SANOJ")?
Kiitos erittäin paljon jo etukäteen!
single-muuttujan numeromäärän saa näin:
MunSinglenPituus = LEN(STR$(MunSingle))
Tietyt kirjaimet saa LEFT$
- tai RIGHT$
-funktioilla.
Arrayn saa kai näin:
DIM MunArray() AS INTEGER
Tietyn määrän kirjaimia saat LEFT$-funktiolla.
Singlen pituus toimii hienosti! Kiitos siitä!
Kiitos linkistä, hunajavohveli!
Array-koodi ei pelitä: "Expected: expression"
Unohtui vielä yksi kysymys: Onko QB:ssa jotain tapaa suorittaa muuttujan sisällä olevaa koodia, niin kuin PHP:ssa on?
Kiitos!
Array-määrittely vaatii sulkuihin sen arrayn koon. Katsopa vaikka Putkan QBasic-oppaan toisesta osasta, siellä oli oikeannäköistä koodia.
Koodin suoritukseen tuskin on tapaa.
Kiitos! Nyt toimii!
Vielä pari kysymystä (ei, en aio lopettaa ikinä):
Millä funktiolla voi laskea arrayn pituuden? Tai onko QB:ssa jotain array_push():in tyylistä funktiota, jotta en vahingossa pistä arrayhyn jonkin arvon päälle jo jotain, tai ettei sinne pääse rakoja väliin?
Ja miten QB:lla voisi yksinkertaisimmillaan luoda simulaatioajan, eli taustalla juoksevan päivämäärän (joka ei siis häiriinny GOTOista tai muista funktioista) niin, että yksi päivä kestäisi 2 sekuntia?
Kiitän mitä hartaimmin taas etukäteen niitä, joilla liikenee kallista aikaa suurimpaan sarjaani tyhmiä kysymyksiä 24 tunnin sisällä.
Mitähän oikein tarkoitat arrayn pituudella? Kuinka monta solua vai mitä?
array_push vastaavaa ei tietääkseni QB:sta löydy, joskaan moisen tekeminen ei kovinkaan vaikeaa ole.
Simulaatioajan tekeminen onnistunee helpoimmin tarkkailemalla tietokoneen kelloa ja jos nyk.aika - lähtöaika > 2 sek. niin silloin päivä = päivä + 1.
Taulukon pienimmän indeksin kertoo funktio LBOUND ja suurimman indeksin kertoo funktio UBOUND. Ohjelmoijan täytyy itse pitää huolta siitä, että taulukon oikeaan kohtaan menee oikea arvo.
Funktio TIMER ilmoittaa, kuinka monta sekuntia on kulunut keskiyöstä. Tämän avulla voi laskea, kuinka kauan peli on ollut käynnissä. Sekuntien laskurin (TIMER) nollaantuminen vuorokauden vaihtuessa täytyy ottaa huomioon.
Eli siis jos aloitan tyhjän arrayn, voin UBOUNDia käyttämällä lisäillä ja tuhoilla arrayn viimeisiä tietoja, ja näin rakoja tms. ei pääse syntymään?
TIMERin kanssa saattaa mennä suht koht vaikeaksi. Jonkinlainen simppeli esimerkki voisi olla toki kohdallaan...
Kiitos teille molemmille (ja joku moderaattori voisi poistaa sen kolmannen threadin)!
Taulukko kannattaa heti aluksi määritellä niin suureksi, että siihen mahtuu kaikki tarvittava tieto.
Jos taulukon määrittelee sanalla REDIM, sen kokoa pystyy muuttamaan myöhemmin määrittelemällä sen uudestaan. Jos taulukon kokoa muuttaa, se kuitenkin tyhjentyy. (QB7.1:ssä on tosin avainsana PRESERVE, jota käyttämällä vanha tieto säilyy.)
PHP:n taulukoihin tottuneelle QB:n taulukot voivat tuntua rajoittuneilta. QB:ssä taulukolle annetaan siis heti määrittelyssä muuttumaton koko ja muuttumaton tyyppi. Tämän jälkeen taulukon arvoja voi ainoastaan lukea ja niitä voi muuttaa.
Hienoa, uskoisin että ymmärsin miten kuten. Joka tapauksessa, tiedän, että se on rajoittuneempi, mutta se on itse asiassa hyväkin asia mitä peleihin tulee. Itse kun käytän taulukkoa esim. hankittujen laitteiden tietojen listaukseen, niin sitten kun on hankittu niin monta ensimmäisen luokan laitetta kun taulukkoon sopii, on peli virallisesti läpäisty. Hyvä. Kiitos paaaaljon.
Entäpä se TIMER? Kaikki mitä tässä nyt ehdin väsäilemään oli hieman väkisten väännetty... Hmh.
Teinpä tällaisen funktion, jonka pitäisi selviytyä myös vuorokauden vaihdoksesta.
' aloitetaan ajanlasku alku& = aika&(1) CLS WHILE 1 ' näytetään kuluneiden päivien määrä ylärivillä LOCATE 1, 60 PRINT aika&(0) \ 2 WEND FUNCTION aika& (nollaa%) STATIC paivat&, vanha& IF nollaa% THEN vanha& = INT(TIMER) paivat& = 0 ELSE uusi& = INT(TIMER) WHILE uusi& <> vanha& vanha& = vanha& + 1 paivat& = paivat& + 1 IF vanha& = 86400 THEN vanha& = 0 WEND END IF aika& = paivat& END FUNCTION
Ohjelman alussa funktiota kutsutaan parametrilla 1, ja siitä hetkestä käynnistyy ajanlasku. Tämän jälkeen funktiota kutsutaan parametrilla 0, jolloin se palauttaa kuluneiden sekuntien määrän. Esim. jos sekuntien määrän jakaa kahdella, tulos on kahden sekunnin pituisten päivien määrä.
(Ohjelmassa on ikuinen silmukka, joten ohjelma täytyy sulkea painamalla Control + Break.)
En pääse sitä tänään enää testaamaan, mutta kiitos erittäin erittäin paljon loputtomasta apusi määrästä ja korvaamattomuudesta. Testaan sitä heti huomenna kun pääsen töistä. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.