Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6, VBA: funktiolla 2 palautusarvoa? (vb6)

Sivun loppuun

Sinis [12.10.2006 13:40:58]

#

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

Hycke [12.10.2006 14:04:30]

#

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

setä [12.10.2006 14:05:16]

#

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.

A-P [12.10.2006 14:12:40]

#

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.

Sinis [12.10.2006 14:39:53]

#

Kiitokset vastauksesta (erityisesti Hyckelle)!

Mitäköhän se Setä tarkoittaa aliohjelman palautusarvoilla? Miten sellaiset määritellään?

setä [12.10.2006 14:45:18]

#

Tarkoitin yksinkertaisesti yhteisiä tai yleisiä muuttujia.

_Pete_ [12.10.2006 15:06:16]

#

setä kirjoitti:

Tarkoitin yksinkertaisesti yhteisiä tai yleisiä muuttujia.

Meinaatko että aliohjelmissa muuteltaisiin globaaleja muuttujia ilman että niitä sinne erikseen välitetään?

setä [12.10.2006 15:24:36]

#

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.

Metabolix [12.10.2006 15:29:42]

#

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

_Pete_ [13.10.2006 10:17:10]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta