Voiko funktio palauttaa useamman kuin yhden arvon? Eli nyt olen tehnyt funktion, joka hakee lähtötietojen (string) perusteella kahta arvoa (single), jotka pitäisi palauttaa kutsuvaan aliohjelmaan. Pitääkö molemmille arvoille tehdä oma funktio vai pystyykö homman hoitamaan jotenkin muuten???
Teet oman tyypin jossa on useampi arvo.
Vaikka oheiseen tyyliin:
tehty VBA:lla pitäisi toimia sinällään VB6:ssa
'declarations Type Oma Arvo1 As Single Arvo2 As Single End Type Sub Macro1() Dim Paluuarvo As Oma Paluuarvo = omaFunktio("tekstiä1") 'kutsun jälkeen paluuarvo.arvo1 sisältää merkkijonon pituuden ja paluuarvo.arvo2 jotain muuta End Sub Function omaFunktio(iArvo As String) As Oma Dim oArvo As Oma oArvo.Arvo1 = Len(iArvo) 'palautetaan inputstringin pituus arvossa1 oArvo.Arvo2 = 9 ' jotain muuta arvossa2 omaFunktio = oArvo End Function
Funktio on muuttujakohtainen eli ei voi paitsi jos ymppäät nuo kaksi singleä jotenkin yhteen doubleen ja siitä sitten taas erottelet ne. Käytä funktion sijasta aliohjelmaa, jolle voit määrittää palautusarvoja rajatta.
Tässä on nyt erehtymisen mahdollisuus, sillä en ole ohjelmoinut VB:llä vuosiin. Yleensä "varsinaisissa" ohjelmointikielissä tämä ei onnistu, kuin taulukon tai viiteparametrien avulla, toisin kuin skriptikielissä.
Kuvauksesi perusteellä oletan, että aliohjelma purkaa merkkijonosta kaksi arvoa ja palauttaa ne.
Kirjoitan Pascalia muistuttavana pseudona, koska VB:n syntaksi on hakusessa.
function parsiMjono(mjono) : arvot[1..2]; begin apu[1] <- parsiEnsimmäinenArvo(mjono); apu[2] <- parsiToinenArvo(mjono); return apu; end;
Seuraavassa IN tarkoittaa arvoparametriä ja INOUT tarkoittaa viiteparametriä.
function parsiMjono(mjono:IN, luku1:INOUT, luku2:INOUT); begin luku1 <- parsiEnsimmäinenArvo(mjono); luku2 <- parsiToinenArvo(mjono); end;
Korjaus: Onnistuu tosiaan myös oman tyypin avulla.
Kiitokset vastauksesta (erityisesti Hyckelle)!
Mitäköhän se Setä tarkoittaa aliohjelman palautusarvoilla? Miten sellaiset määritellään?
Tarkoitin yksinkertaisesti yhteisiä tai yleisiä muuttujia.
setä kirjoitti:
Tarkoitin yksinkertaisesti yhteisiä tai yleisiä muuttujia.
Meinaatko että aliohjelmissa muuteltaisiin globaaleja muuttujia ilman että niitä sinne erikseen välitetään?
Määritetään moduulitason (tai sitten globaalit) muuttujat arvo1 ja arvo2 joille lasketaan arvot aliohjelmassa. Ovat sitten käytettävissä muissa proseduureissa. Eihän tässä mitään ihmeellistä ole.
Viitteenä annettuja muuttujia voi muutella.
Sub Juttu(ByVal Tekstiä As String, ByRef Luku As Single, ByRef Toinen_Luku As Double) Luku1 = 7.2 ' "paluuarvo" End Sub
setä kirjoitti:
Määritetään moduulitason (tai sitten globaalit) muuttujat arvo1 ja arvo2 joille lasketaan arvot aliohjelmassa. Ovat sitten käytettävissä muissa proseduureissa. Eihän tässä mitään ihmeellistä ole.
On siinä. Sitä kutustaan aliohjelman tekemäksi sivuvaikutuksiksi ja niitä pitää viimiseen asti välttää. Tuollaisten käyttö tekee koodista erittäin virhealtista.
Taisi olla jopa niin, että lipaston ohjelmointikurssien harjoitustöistä kun noita löytyy tulee penaltia arvosanasta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.