Avatar billede nexus-6 Nybegynder
13. august 2002 - 21:50 Der er 12 kommentarer og
1 løsning

Return flere værdier eller et array fra en funtion ??

Hej Eksperter !
Hvordan får jeg en funktion som denne her til at returner flere værdier:

Function CalcRoots(a, b, d) As Double
    If d >= 0 Then
            solutions(0) = (-b - Sqr(d)) / (2 * a)
            If d > 0 Then
                solutions(1) = (-b + Sqr(d)) / (2 * a)
            Else
                solutions(1) = solutions(0)
            End If
        End If

I C får jeg dem returneret med en "return solutions", men hvordan er det i Visual Basic ??
Avatar billede johs_j Novice
13. august 2002 - 22:22 #1
Det kan man ikke. En function kan kun returnere een værdi. Men du kan ændre den til en Sub. Den kan returnere så mange værdier som du har brug for.
Avatar billede nexus-6 Nybegynder
13. august 2002 - 22:37 #2
Mener du Subroutines ??
Kan du ikke give et eksempel ?
Avatar billede johs_j Novice
13. august 2002 - 23:08 #3
' Først med kald af funktion ***************************************

Sub form1_load()
dim TestVar, var1, var2, var3

TestVar = CalcRoots(var1, var2, var3)
Text1.text = TestVar
End Sub

Function CalcRoots(a, b, d) As Double
' a,b,c skal også her dim'es

    If d >= 0 Then
            solutions(0) = (-b - Sqr(d)) / (2 * a)
            If d > 0 Then
                solutions(1) = (-b + Sqr(d)) / (2 * a)
            Else
                solutions(1) = solutions(0)
            End If
        End If
' Her skal returværdien sættes
' ellers får du ingen returværdi

CalcRoots = solutions(1)

End function

' så med kald til Sub **********************************************

Sub form1_load()
dim  var1, var2, var3
var1=10
var2=56
var3=15

CalcRoots1(var1, var2, var3)
Text1.text = var1
Text2.text = var2
Text3.text = var3
End Sub

Sub CalcRoots1(a, b, d) As Double
' a,b,c arver dim fra var1,var2, var3

    If d >= 0 Then
            solutions(0) = (-b - Sqr(d)) / (2 * a)
            If d > 0 Then
                solutions(1) = (-b + Sqr(d)) / (2 * a)
            Else
                solutions(1) = solutions(0)
            End If
        End If

a = solution(0)
b = solution(1)
'Der kan også returneres i d, men man behøver det ikke

End function
Avatar billede bak Forsker
14. august 2002 - 13:03 #4
Du kan godt returnere et array (variant) indeholdende begge resultater, problem er bare at bruge det.
Efter kørslen vil Calcroots indeholde begge værdier i en Variant.

Option Base 1
Function CalcRoots(a As Double, b As Double, d As Double) As Variant
    Dim solutions(2)
    If d >= 0 Then
            solutions(1) = (-b - Sqr(d)) / (2 * a)
            If d > 0 Then
                solutions(2) = (-b + Sqr(d)) / (2 * a)
            Else
                solutions(2) = solutions(1)
            End If
        End If
    CalcRoots = solutions
End Function
Avatar billede bak Forsker
14. august 2002 - 13:11 #5
Du kan prøve at teste sådan her:
Sub test()
Dim result As Variant
result = CalcRoots(3, 1, 5)
MsgBox "Tal 1:  " & result(1) & "  Tal 2: " & result(2)
End Sub
Avatar billede nexus-6 Nybegynder
14. august 2002 - 21:53 #6
Kan ikke rigtig få det til at virke :-(
Kan i se hvad jeg gøre galt ??

Private Sub CalcDeter_Click()
    Dim a, b, c As Double
    a = Text1.Text
    b = Text2.Text
    c = Text3.Text
    Text4.Text = CalcD(a, b, c)
End Sub
Public Sub CalcRoots_Click()
    Dim a, b, c, d As Double
    Dim result As Variant
        a = Text1.Text
        b = Text2.Text
        c = Text3.Text
        d = CalcD(a, b, c)
        result = CalcR(a, b, d)
        Text4.Text = result(0) & result(1)
    End Sub
Function CalcD(a, b, c As Double) As Double
    CalcD = (b * b) - (4 * a * c)
End Function

Function CalcR(a, b, d As Double) As Variant
    If d >= 0 Then
        solutions(0) = (-b - Sqr(d)) / (2 * a)
        If d > 0 Then
            solutions(1) = (-b + Sqr(d)) / (2 * a)
        Else
            solutions(1) = solutions(0)
        End If
    End If
    ClacR = solutions
End Function
Avatar billede bak Forsker
15. august 2002 - 08:22 #7
jeg tror du lige skal have omformet .text til Double
a=CDbl(text1.text)
Avatar billede bak Forsker
15. august 2002 - 08:43 #8
Så, dette skal virke.

Option Base 1
Private Sub CalcRoots_Click()
    Dim a As Double, b As Double, c As Double, d As Double
    Dim result As Variant
        a = CDbl(TextBox1.Text)
        b = CDbl(TextBox2.Text)
        c = CDbl(TextBox3.Text)
        d = CalcD(a, b, c)
        result = CalcR(a, b, d)
        TextBox4 = result(1) & "  " & result(2)
End Sub

Private Sub CalcDeter_Click()
    Dim a As Double, b As Double, c As Double
    a = CDbl(Text1.Text)
    b = CDbl(Text2.Text)
    c = CDbl(Text3.Text)
    Text4.Text = CalcD(a, b, c)
End Sub

Function CalcD(a As Double, b As Double, c As Double) As Double
    CalcD = (b * b) - (4 * a * c)
End Function

Function CalcR(a As Double, b As Double, d As Double) As Variant
Dim solutions(2)
    If d >= 0 Then
        solutions(1) = (-b - Sqr(d)) / (2 * a)
        If d > 0 Then
            solutions(2) = (-b + Sqr(d)) / (2 * a)
        Else
            solutions(2) = solutions(1)
        End If
    End If
    CalcR = solutions
End Function
Avatar billede bak Forsker
15. august 2002 - 09:34 #9
Husk lige at ændre TextBox1. til Text.
Avatar billede nexus-6 Nybegynder
15. august 2002 - 14:02 #10
Hej igen.
Det hjalp en del, men nu brikker den sig over min CalcR funktion. Den siger at den er gal med linien:
solutions(1) = (-b - Sqr(d)) / (2 * a)
Ved i hvorfor ??
Avatar billede nexus-6 Nybegynder
15. august 2002 - 15:04 #11
Ovenstående problem er løst.
Nu fejler den bare med udskrivningen af rødderne koden er her:

Public Sub CalcRoots_Click()
    Dim a As Double, b As Double, c As Double, d As Double
    Dim result As Variant
    a = CDbl(Text1.Text)
    b = CDbl(Text2.Text)
    c = CDbl(Text3.Text)
    d = CalcD(a, b, c)
    result = CalcR(a, b, d)
    Text4.Text = result(0) & " " & result(1)
    End Sub

Problemet er, at result er "Empty" og derfor kan den naturligvis ikke udskrive på den næste linie
Nogen forslag ??
Avatar billede bak Forsker
15. august 2002 - 21:58 #12
Måske fordi at en Variant ikke har et 0, men starter ved 1
altså result(0) findes ikke. Derfor har jeg også skrevet result(1) og (2) og for at være konsistent har jeg også option base 1 med således at miy array solutions også starter ved element 1
Avatar billede nexus-6 Nybegynder
16. august 2002 - 17:58 #13
Så fandt jeg endelig ud af det :-)
Takker mange gange for hjælpen...

Mvh.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester