Kirjoittaja: Merri
Kirjoitettu: 06.06.2006 – 06.06.2006
Tagit: ohjelmointitavat, koodi näytille, vinkki
Visual Basic 6:ssa on useita muuttujatyyppejä, jotka kuitenkin ovat osittain rajallisia verrattaessa muutamiin muihin ohjelmointikieliin ja kääntäjiin. VB näet ei anna kovinkaan laajaa skaalaa erilaisia muuttujatyyppejä, vaan tarjonta rajoittuu vain muutamiin. Tämä voi aiheuttaa ongelmia, joita joutuu kiertämään. Kaikkien ongelmien selvittäminen ei ole edes mahdollista. Näistä tiedoista voi olla runsaasti hyötyä numeroiden kanssa pelleillessä.
Boolean (16 bittiä / 2 tavua)
Voi sisältää joko arvon False tai True. Numeroina False = 0, True = -1. Tätä tietoa voi käyttää hyväksi joissakin kaavoissa ilman että tarvitsee sortua monimutkaisiin If Then Else -riveihin.
Booleanin 16-bittisyys tulee historiallisista syistä: vanhoissa VB:n versioissa oli vain 16-bittinen Integer, johon Boolean oli lähinnä yksinkertainen "huijaus".
Byte (8 bittiä / tavu)
Voi olla kokonaisluku välillä 0-255. Mitään suurta erikoista ei tarvitse ottaa huomioon Byteä käytettäessä.
Integer (16 bittiä / 2 tavua)
Integerin yli tavu on varattu tiedolle siitä, onko luku negatiivinen vaiko ei. Integer voi olla väliltä -32768 - 32767. Binäärinä ajateltuna luku -1 on &HFFFF ja -32768 on &H8000.
Tähän väliin lienee sopivaa huomauttaa, että mikäli erikseen asiaa ei määritetä, käyttää VB pienintä sopivaa muuttujatyyppiä lukujen esittämiseen. Täten heksaluku &HFFFF on -1 eikä 65535, jonka taas saa kirjoittamalla &HFFFF& - näiden molempien binääriarvo on silti sama, ainoa ero tulee bittien määrässä! On siis tärkeää huomioida, mikä muuttujatyyppi on kulloinkin käytössä.
Long (32 bittiä / 4 tavua)
Long on kuten Integer, mutta isompi. Luku on väliltä -2147483648 ... 2147483647
Jos luet tiedostoa, josta saat 16-bittisen luvun joka ei voi olla negatiivinen, voit muuttaa Integerin Longiksi varsin helposti. Katso esimerkki yksi koodilistauksesta.
Currency (64 bittiä / 8 tavua)
Currency on VB:n erikoisempi muuttujatyyppi. Se on 64-bittinen "kokonaisluku" kuten Byte, Integer ja Long, mutta voi silti sisältää neljä desimaalilukua. Tämä on toteutettu yksinkertaisesti siirtämällä desimaalipilkkua vasemmalle. Toisin kuin seuraavaksi esittelyyn tulevat liukulukutyypit, Currency on aina tarkka sisältämänsä arvon suhteen. Currency on paras vaihtoehto, jos tarvitsee käsitellä esimerkiksi suuria rahasummia.
Binäärinä Currency näyttää tältä:
00000000 00000001 = 1 (Integer) 00000000 00000001 = 0.0001 (Currency) 00100111 00010000 = 1 (Currency) 00100111 00010000 = 10000 (Integer)
Single (32 bittiä / 4 tavua)
Single on liukuluku. Tämä tarkoittaa sitä, että muuttuja sisältää tarkasti muutaman luvun, jonka lisäksi osa biteistä on varattu sisältämään tietoa desimaalipilkun paikasta. Tämä johtaa siihen, että vaikka luku voi olla todella pieni tai todella iso, sen tarkkuus ei riitä kovin pitkälle. Muuttuja on hyödyllinen jos luvun tarkkuus ei ole tärkeää, kunhan se on "sinne päin".
Double (64 bittiä / 8 tavua)
Double on tarkempi kuin Single ja voi sisältää enemmän tarkasti muistettuja lukuja. Se voi myös olla huomattavasti isompi/pienempi. Liukulukujen epätarkkuus pätee silti siinäkin.
Decimal (96 bittiä / 12 tavua)
Decimal on eräänlaista jatkoa Integer -> Long -linjalle. Tätä muuttujatyyppiä voi käyttää vain Variant-muuttujatyypin kautta. Variant on todella hidas käyttää, johtuen sen helppokäyttöisyydestä ja joustavuudesta. Kaiken lisäksi koodiin ei voi suoraan kirjoittaa Decimalin kokoluokkaan meneviä lukuja, vaan ne on pakko syöttää esimerkiksi tekstinä (String) ja muuttaa vasta sitten erillisellä kutsulla Decimaliksi.
Decimal voi olla väliltä -79228162514264337593543950335 ... 79228162514264337593543950335
Muuttujakomentoja
VB:ssä voi muuntaa muuttujia toiseen muuttujatyyppiin käyttämällä seuraavia komentoja:
- CBool (Boolean: 0 = False, muu luku muuntuu Trueksi)
- CByte (Byte)
- CInt (Integer)
- CLng (Long)
- CCur (Currency)
- CSng (Single)
- CDbl (Double)
- CDec (Variant, jonka alatyypiksi on määritetty Decimal)
Huomioi että CBoolia lukuunottamatta nostatutat virheen, jos yrität asettaa niin suurta lukua muuttujatyypille ettei se sellaista kykene sulattamaan.
Muuta huomioitavaa
Matemaattisten operaattorien suhteen toimiminen on ongelmallista erittäin suurten lukujen kanssa. Niin And, Or, Xor, Mod kuin \ toimivat vain ja ainoastaan korkeintaan 32-bittisten lukujen kanssa. Toisinsanoen raja on Longissa. Lisäksi Currencyä ei voi käsitellä binääritasolla suoraan, vaan Currency muuntuu aina Longiksi ennen kuin se joutuu kosketuksiin edellämainittujen operaattoreiden kanssa.
' Esimerkki 1: Integer -> Long -muunnos binääritasolla Option Explicit Private Sub Form_Load() Dim IntegerLuku As Integer, LongLuku As Long IntegerLuku = -1 LongLuku = IntegerLuku And &HFFFF& MsgBox LongLuku End Sub ' Esimerkki 2: Long -> Currency -muunnos siten, että binääriarvon ylintä bittiä ei käsitellä negatiivimerkkaajana Private Sub Form_Load() Dim LongLuku As Long, CurrencyLuku As Currency LongLuku = CLng(-1) If LongLuku < 0 Then CurrencyLuku = CCur(LongLuku And &H7FFFFFFF) + 2147483648# Else CurrencyLuku = LongLuku End If MsgBox CurrencyLuku End Sub
Mainio katsaus. Ehkä tuosta mystisestä Decimal-tyypistä voisi olla koodiesimerkki.
Decimal-tyypillä voi suorittaa tarkkoja aritmeettisia laskutoimituksia (max 29 numeroa). Myös desimaalilukuja voi käyttää, mutta ei eksponentti esitystä. Lausekkeessa oltava ainakin yksi decimal-tyypiksi määritetty muuttuja, jotta laskenta suoritetaan decimal-tarkkuudella.
Piti tehdä hieman korjauksia: Decimal onkin 96-bittinen eikä 64-bittinen, kuten muistelin. Asiat eivät kuitenkaan muutu miksikään: hidas ja epäkäytännöllinen muuttujatyyppi se pitkälti silti on, vaikka voikin olla todella suurikokoinen. Tavanomaiset plus-, miinus-, kerto- ja jakolaskut ovat hieman rajoittavia.