Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: aliohjelma [vb6]

Ropertto IV [14.12.2010 17:20:21]

#

Taas aivan yksinkertainen ongelma. Miksi aliohjelmaan viittaava joku(1, 1) ei toimi? Jos viitataan funktioon tulos = joku(1, 1), koodi toimii. Samoin toimii aliohjelmaan viittaava joku(1). Kaksi muuttujaa sisältävä aliohjelma kuitenkaan ei.

Option Explicit
Private Sub Form_Load()
    joku(1, 1)
End Sub

Sub joku(i As Integer, j As Integer)
    MsgBox "HEI!"
End Sub

Grez [14.12.2010 21:26:25]

#

Sulla on ylimääräiset sulut tuossa.

Eli:

Joku 1, 1 'Toimii
'tai
Jotain = joku(1, 1) 'Toimii

'Mutta ei sekaisin
joku(1, 1) 'Ei toimi

'Toisaalta yksittäisen arvon voi laittaa sulkuihin joten
Joku 1 'Toimii
Joku (1) 'Sama asia

Joku 1, 1 'Toimii
Joku (1), (1) 'Sama asia

Antti Laaksonen [14.12.2010 23:24:22]

#

Tässä on vielä yksi tapa:

Call joku(1, 1)

Merri [15.12.2010 08:42:32]

#

Tuodaan tässä samalla esille ero ByRefin ja ByValin välillä:

Option Explicit
Private Sub Form_Load()
    Dim i As Integer, j As Integer

    i = 1
    j = 2
    joku i, j
    MsgBox "i = " & i & vbNewLine & "j = " & j

    i = 1
    j = 2
    jokutoinen i, j
    MsgBox "i = " & i & vbNewLine & "j = " & j
End Sub

' tämä on sama kuin Sub joku(ByRef i As Integer, ByRef j As Integer)
Sub joku(i As Integer, j As Integer)
    i = 0
    j = 0
End Sub

Sub jokutoinen(ByVal i As Integer, ByVal j As Integer)
    i = 0
    j = 0
End Sub

ByRef: muutat sitä samaa muuttujaa, joka on syötetty proseduuriin (viitattu).
ByVal: muutat kopiota muuttujasta, joka on syötetty proseduuriin (arvo kopioitu).

Yleensä ByVal on parempi, sillä se vähentää kömmähdyksiä. ByRef on parempi silloin, kun halutaankin muuttaa muuttujien arvoja. Tietyissä tapauksissa kuten merkkijonojen käsittelyssä ByRef voi olla parempi sen vuoksi, ettei muuttujasta tarvitse tehdä kopiota, joka hidastaisi käsittelyä erityisesti suurien merkkijonojen kohdalla.

Ropertto IV [15.12.2010 19:18:31]

#

Suuret kitokset, paljon hyödyllistä tietoa.

Vastaus

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

Tietoa sivustosta