in

Funktionsprozedur, die mehrere Werte zurückgibt

Letzter Beitrag 04-27-2007 19:36 von arnd. 8 Antworten.
Seite 1 von 1 (9 Treffer)
Beiträge sortieren: Zurück Weiter
  • 04-16-2007 20:45

    • arnd
    • Top 100 Mitwirkender
    • Registriert am 02-11-2007
    • Beiträge 31

    Funktionsprozedur, die mehrere Werte zurückgibt

    Hi, ich möchte die folgende For-Next Schleife, in der mehrere Werte berechnet und einige gleich in eine Diagramm gezeichnet werden, durch eine Funktionsprozedur ersetzen:

    For i As Integer = 0 To Nniv
                x = i * DW
                ni = Int(Math.Exp(-i * DE / kT) * N1 / q + 0.5)
                If ni < 1 Then Exit For
                lnni = 0.5 * Math.Log(2 * Math.PI * ni) + ni * Math.Log(ni / e)
                draw_curve(x, ni)
                If i > 0 Then
                    kaTe = kaTe + (x - 0) / (Math.Log(Int(N1 / q + 0.5)) - Math.Log(ni))
                End If
                linie.Add(x, ni)
                nocc = i + 1
                ng = ng + ni
                Eth = Eth + x * ni
                sigma = sigma + lnni
    Next i

    In der Hilfe habe ich gelesen, dass eine Funktion mehrere Return Anweisungen haben kann, und habe es so probiert:

    Public Function multifunction(ByVal DW, ByVal DE, ByVal kT, ByVal N1, ByVal q)
            Dim ni, ng, nocc As Integer
            Dim x, Eth, lnni, sigma, kaTe As Double
            Dim linie As New PointPairList

            For i As Integer = 0 To Nniv
                x = i * DW
                ni = Int(Math.Exp(-i * DE / kT) * N1 / q + 0.5)
                If ni < 1 Then Exit For
                lnni = 0.5 * Math.Log(2 * Math.PI * ni) + ni * Math.Log(ni / e)
                If i > 0 Then
                    kaTe = kaTe + (x - 0) / (Math.Log(Int(N1 / q + 0.5)) - Math.Log(ni))
                End If

                draw_curve(x, ni)
                linie.Add(x, ni)
                nocc = i + 1
                ng = ng + ni
                Eth = Eth + x * ni
                sigma = sigma + lnni
            Next i
            Return kaTe
            Return linie
            Return nocc
            Return ng
            Return Eth
            Return sigma
    End Function

    Leider ohne Erfolg. Es läuft zwar ohne Meckern durchs Debuggen, aber ich kann im Hauptprogramm nicht auf die Werte zugreifen. Was hab ich falsch gemacht?

    Danke im Voraus

    Arnd

    • IP-Adresse ist Registriert
  • 04-16-2007 22:22 Antwort zu

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    Eine Funktion kann zwar mehrere Return-Anweisungen haben, sobald aber eine ausgeführt wird, wird der Wert zurückgegeben und die Funktion ist beendet.

    Die Rückgabe mehrere Werte aus einer Funktion ist so also nicht möglich.

    Du kannst aber eine Klasse definieren, die die benötigten Werte als Eigenschaften hält.

    Microsoft Student Partner
    Universität Stuttgart

    Jan-Cornelius Molnar

    • IP-Adresse ist Registriert
  • 04-16-2007 22:24 Antwort zu

    • socke
    • Top 10 Mitwirkender
    • Registriert am 04-16-2007
    • VB.Net: Visual Studio 2008 EE
    • Beiträge 373

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    meine idee wäre jetzt gewesen das ganze in einer collection zusammen zufassen und dann als eine variable zurück zuschicken. du kannst dann anhand des keys, den du beim hinzufügen der Variable in die collection deklarierst hast, die variable später wieder aus der collection rausholen:


    [code language="VB.NET"]Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


    Dim collection1 As Collection = multifunction()

    'Lädt die Werte aus der Collection anhand des "Keys", der beim Hinzufügen deklariert worden ist.
    Dim ng As Integer = collection1.Item("a")
    Dim eth As Double = collection1.Item("b")

    MsgBox(ng & " " & eth)

    End Sub

    Public Function multifunction()
    Dim collection1 As New Collection

    Dim ng As Integer = 5
    Dim eth As Double = 9.8

    'Fügt die Werte und den entsprechenden "Key" der Collection hinzu.
    collection1.Add(ng, "a")
    collection1.Add(eth, "b")

    Return collection1
    End Function
    End Class[/code]



    Lukas
    Wenn aus einem Raum mit sieben Leuten acht rausgehen, dann muss einer zurückkommen, damit keiner mehr drin ist.
    • IP-Adresse ist Registriert
  • 04-17-2007 8:08 Antwort zu

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    Bau die eine Klasse die die Eigenschaften speichert so wie es jan gesagt hat. Das ist das Beste was du tun kannst
    • IP-Adresse ist Registriert
  • 04-17-2007 8:27 Antwort zu

    • Peter_Punkt
    • Top 10 Mitwirkender
    • Registriert am 03-28-2007
    • VS 2008/10/12/13, VB.NET, C#, Office 2007, Win 7
    • Beiträge 2.493

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    Das mit der Klasse ist m. E. der richtige Weg.

    Wenn es aber unbedingt eine Collection sein muß, dann beherzigt den Hinweis von Jan, nachzulesen unter http://vb-magazin.de/forums/forums/post/8280.aspx

    Zwar weiß ich viel, doch möcht' ich alles wissen.
    Dass ich erkenne, was die Welt im Innersten zusammenhält
    • IP-Adresse ist Registriert
  • 04-17-2007 15:26 Antwort zu

    • arnd
    • Top 100 Mitwirkender
    • Registriert am 02-11-2007
    • Beiträge 31

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    ich habe beide Vorschläge ausprobiert - ohne Erfolg. Bei der collection Variante erhielt ich schon in der IDE den Hinweis, dass die collection nicht für alle Codepfade einen Wert zurückliefert. (Die Strict-Einstellung hab ich unverändert auf off gelassen)  Mein Code:

    Public Function multifunction(ByVal DW, ByVal DE, ByVal kT, ByVal N1, ByVal q)
            Dim collection1 As New Collection
            Dim ni, ng, nocc As Integer
            Dim x, Eth, lnni, sigma, kaTe As Double
            Dim huell As New PointPairList
        For i As Integer = 0 To 40
            x = i * DW
            ni = Int(Math.Exp(-i * DE / kT) * N1 / q + 0.5)
            If ni < 1 Then Exit For
            lnni = 0.5 * Math.Log(2 * Math.PI * ni) + ni * Math.Log(ni / e)
            If i > 0 Then
                 kaTe = kaTe + (x - 0) / (Math.Log(Int(N1 / q + 0.5)) - Math.Log(ni))
            End If
            draw_curve(x, ni)
            huell.Add(x, ni)
            nocc = i + 1
            ng = ng + ni
            Eth = Eth + x * ni
            sigma = sigma + lnni
        Next i
            Debug.Print("sub, Eth " & Eth & ", sigma " & sigma)
            collection1.Add(kaTe, "a")
            collection1.Add(nocc, "b")
            collection1.Add(ng, "c")
            collection1.Add(Eth, "d")
            collection1.Add(sigma, "e")
            collection1.Add(huell, "f")
        End Function

    Der Beispielcode von Socke produziert diesen Fehler nicht, vermutlich weil er keine for - next- Schleife mit Bedingungen enthält.

    Über eine eigene Class habe ich es auch versucht - auch ohne Erfolg. Aber es gab im IDE keine Fehlermeldung, nur kamen die berechneten Daten im Hauptcode der Form1 nicht an, obwohl doch alles public ist. Hier meine Code Versuche:

    Public Class Form1
        Dim DW As Double = 1.4
        Dim DE As Double = 2.1
        Dim kT As Double = 3.01
        Dim N1 As Integer = 500
        Dim q As Double = 1.34
        Dim Eth As Double
        Dim nocc As Integer
        Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim multiclass2 As multiClass1
            multiclass2 = New multiClass1
            multiclass2.berechnung(DW, DE, kT, N1, q)
            MsgBox("Eth " & Eth & ", nocc " & nocc)
        End Sub
        Public Class multiClass1
            Dim ni, ng, nocc As Integer
            Dim x, Eth, lnni, sigma, kaTe As Double
            Dim eul As Double = Math.Exp(1)
            Public Sub berechnung(ByVal DW, ByVal DE, ByVal kT, ByVal N1, ByVal q)
                For i As Integer = 0 To 40
                    x = i * DW
                    ni = Int(Math.Exp(-i * DE / kT) * N1 / q + 0.5)
                    If ni < 1 Then Exit For
                    lnni = 0.5 * Math.Log(2 * Math.PI * ni) + ni * Math.Log(ni / eul)
                    If i > 0 Then
                        kaTe = kaTe + (x - 0) / (Math.Log(Int(N1 / q + 0.5)) - Math.Log(ni))
                    End If
                    nocc = i + 1
                    ng = ng + ni
                    Eth = Eth + x * ni
                    sigma = sigma + lnni
                Next i
                Debug.Print("sub, Eth " & Eth & ", sigma " & sigma)
            End Sub
        End Class
    End Class

    Die Variablen aus Form1 kommen in der multiClass1 an wie das Debug.Print zeigt, aber in der MsgBox werden nur 0 Werte angezeigt. Wo liegt (liegen die) der Fehler?

    Arnd

    • IP-Adresse ist Registriert
  • 04-17-2007 17:17 Antwort zu

    • socke
    • Top 10 Mitwirkender
    • Registriert am 04-16-2007
    • VB.Net: Visual Studio 2008 EE
    • Beiträge 373

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    ok sorry tut mir leid ich habs nur mit einem double und einem integer wert probiert

    vlt klappts wenn du die variablen vor die subs setzt und mit public deklarierst     weil dann kannst du ja in allen subs und functionen drauf zugreifen aber ich weiß nicht obs klappt

    Lukas
    Wenn aus einem Raum mit sieben Leuten acht rausgehen, dann muss einer zurückkommen, damit keiner mehr drin ist.
    • IP-Adresse ist Registriert
  • 04-17-2007 21:18 Antwort zu

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    Zur Collection

    Der Collection Typ ist ein alter VB Datentyp. Bitte verwendet die neuen, schnelleren und typensicheren .NET Typen!

    Zur Klasse

    Die Klasse solltest du nicht innerhalb deiner Form deklarieren und dann auch noch gleichnamige Variablen verwenden.

    Zugriff auf die Daten erhälst du dann

    [code language="VB.NET"]

    Private Sub DeinTollesSubAufDerForm

    Dim cls As New DeineTolleKlasse

    cls.Berechnung(x,y,z)

    Messagebox.Show(cls.DeineTolleVariable1)

    End Sub

    [/code]

    Für MsgBox gilt das gleiche wie für Collection. Verwendet lieber MessageBox.Show!

     

    Microsoft Student Partner
    Universität Stuttgart

    Jan-Cornelius Molnar

    • IP-Adresse ist Registriert
  • 04-27-2007 19:36 Antwort zu

    • arnd
    • Top 100 Mitwirkender
    • Registriert am 02-11-2007
    • Beiträge 31

    AW: Funktionsprozedur, die mehrere Werte zurückgibt

    Der Vorschlag mit der Klasse war ok. Ich hab es jetzt hinbekommen, auch die if - then Passage funktioniert. Schwierig war es, die Kurve über draw_curve() von der neuen Klasse aus ins Diagramm zu schreiben. Jetzt hab ich es so gemacht, dass ich die PointPairList erst als Variable in die Form1 zurückgeholt hab und dann von dort aus das Diagramm aufgebaut habe.

    Danke allen für die Hilfen.

    Arnd

    • IP-Adresse ist Registriert
Seite 1 von 1 (9 Treffer)