Prozeduren, Fuktionen, was muss alles in der parameter übergabe?

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Prozeduren, Fuktionen, was muss alles in der parameter übergabe?

    Hey, eine kleine Frage die mich schon etwas länger interessiert hat.

    Wenn man eine Prozedur/Function erstellt, was muss man alles im Parameter übergeben?

    zb:

    VB.NET-Quellcode

    1. Private Function berechnen(ByVal a As Integer, ByVal b As Integer)
    2. Dim c As Integer
    3. a = 2
    4. b = 2
    5. c= a * b
    6. Return c


    Kann man auch c in der parameterübergabe schrieben und mit return ausgeben oder geht das nicht?

    zb:

    VB.NET-Quellcode

    1. Private Function berechnen(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer)
    2. a = 2
    3. b = 2
    4. c= a * b
    5. Return c
    Im Prinzip ist daran nichts falsch, nur das ByVal c As Integer ist einfach überflüssig.
    Du kannst das ganez auch so machen:

    VB.NET-Quellcode

    1. Private Function berechnen(ByVal a As Integer, ByVal b As Integer) As Integer
    2. Return a * b
    3. End Function


    Achja, wieso weißt du a und b in der Funktion neue Werte zu? Die werden beim aufrufen der Funktion festgelegt.

    VB.NET-Quellcode

    1. MessageBox.Show(CStr(berechnen(2, 2)))
    2. 'Ausgabe wäre 4
    Achja, wieso weißt du a und b in der Funktion neue Werte zu? Die werden beim aufrufen der Funktion festgelegt.
    Das war jetzt nur so als beispiel gedacht.

    Achso okay, aber in mein buch wird in der funktion zb nochmal deklariert das das ergbenis in der deklaration speichert, aber man kann doch gleich bei der parameterübergabe mit dem ByVal.... alles deklarieren oder nicht? Oder werden da nur die werte übergeben die von außerhalb kommen?

    n0ise schrieb:

    aber in mein buch wird in der funktion zb nochmal deklariert das das ergbenis in der deklaration speichert, aber man kann doch gleich bei der parameterübergabe mit dem ByVal.... alles deklarieren oder nicht?

    1. Bahnhof?
    2. Scheint ein Mistbuch zu sein. Entweder völlig grottig oder für deinen Kenntnisstand einfach zu schwer.

    Übergeben tut man das, was beim Aufruf bekannt und veränderlich ist. Und eine Funktion hat sinnvollerweise einen Rückgabewert/typen, den man im Kopf nach "As ..." schreibt
    aber man kann doch gleich bei der parameterübergabe mit dem ByVal.... alles deklarieren oder nicht

    Klar kann man, wäre aber völliger Schwachsinn.

    Weißt du den Überhaupt wie man diese Funktion aufruft?

    VB.NET-Quellcode

    1. Function berechnen(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer) As Integer
    2. End FUnction
    Weißt du den Überhaupt wie man diese Funktion aufruft?
    Na einfach da wo man sie aufrufen will den namen der funktion schrieben, mit den übergaben, zb:

    VB.NET-Quellcode

    1. Private Function berechnen(ByVal a As Integer, ByVal b as Integer) As Integer
    2. Return a * b
    3. End Function


    Im Button Event

    VB.NET-Quellcode

    1. Dim a As Integer = 2
    2. Dim b As Integer = 2
    3. berechnen(a,b)
    4. MessageBox.Show(berechnen)


    Und die andere

    VB.NET-Quellcode

    1. Function berechnen(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer) As Integer
    2. c = a * b
    3. Return c
    4. End FUnction
    5. ' Im Button Event
    6. Dim a As Integer = 2
    7. Dim b As Integer = 2
    8. berechnen(a,b)
    9. MessageBox.Show(berechnen)


    Ja stimmt.. c is überflüssig^^

    n0ise schrieb:

    Dim a As Integer = 2
    Dim b As Integer = 2
    berechnen(a,b)
    MessageBox.Show(berechnen)

    Das ist Mumpitz.
    Erst berechnest du was, speicherst aber das Ergebnis nicht, also wird es verworfen. Dann rufst du dieselbe Funktion nochmal auf, aber ohne Parameter. Das geht schon beim kompilieren schief. Denn wenn eine Funktion Parameter hat und die nicht "optional" sind, dann MUSS man sie beim Aufruf angeben!

    VB.NET-Quellcode

    1. Function berechnen(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer) As Integer
    2. c = a * b
    3. Return c
    4. End Function
    5. ' Im Button Event
    6. Dim a As Integer = 2
    7. Dim b As Integer = 2
    8. berechnen(a,b)
    9. MessageBox.Show(berechnen)
    Genau das hab ich mir nämlich gedacht.
    Alles was du "ByValst" (außer Optional ByVal) musst du beim aufrufen der Funktion auch angeben.

    Der Aufruf müsste also so aussehen:

    VB.NET-Quellcode

    1. berechnen(a, b, c)


    Aber c wird erst in der Funktion berechnet und ist vorher noch nicht bekannt.
    Du müsstest also irgendwas für c hinschreiben (was auch dem Datentyp entspricht), was natürlich völlig unnötig, unsauber und schwachsinnig ist.

    VB.NET-Quellcode

    1. Dim a As Integer = 2
    2. Dim b As Integer = 2
    3. MessageBox.Show(berechnen(a,b))


    Dann so, ja ich hatte fast nie mit Funktion/Prozeduren gearbeitet, nur vor ca 7-8 monate durchgelesen und bissl rumprobiert weil ich das nie so mochte, aber muss nunmal jetzt sein...

    (zu der funktion ohne c)
    Das ist normalerweise eins der ersten Themen aus einem Grundlagen Buch.
    Ja ich weiß^^ ich habs mir auch durchgelesen , sogar verstanden, aber bis jetzt wieder vegressen und das Buch hat kollege ausgeliehen, ich wollte aber nie so richtig mit arbeiten bzw braucht es eig fast nie weil ich den code meistens nur 1 mal brauchte und driekt in irgendein event reingeschreiben habe.. aber jetzt hab ich das "VB Kochbuch 2010" was davon ausgeht das man funktion, prozeduren etc alles kann, wollte es nur nochmal wiederholn, weils öfter jetzt zum vorwschein kommt.
    Es ist möglich, das Ergebnis-Parameter als ByRef zu übergeben. Sinn, Unsinn, Vorteil, Nachteil, etc ... von den beiden Varianten, darüber kann man streiten.
    Beispiel:

    VB.NET-Quellcode

    1. Private Sub test()
    2. ' ByRef
    3. Dim c As Integer
    4. berechnenSub(2, 3, c)
    5. MessageBox.Show(c.ToString)
    6. 'Function
    7. MessageBox.Show(berechnenFunction(23, 23).ToString)
    8. End Sub
    9. Private Sub berechnenSub(ByVal a As Integer, ByVal b As Integer, ByRef c As Integer)
    10. c = a * b
    11. End Sub
    12. Private Function berechnenFunction(ByVal a As Integer, ByVal b As Integer) As Integer
    13. Return a * b
    14. End Function

    Zusätzliche Infos zum Thema ByRef
    Stell dir eine Funktion wie jemanden vor, der etwas fuer dich macht und dir am Ende ein Ergebnis sagt.
    Bei deiner Funktion werden zwei Zahlen miteinander multipliziert und das Ergebnis zurueckgegeben.
    Du sagst der Funktion also, welche Zahlen du berechnen moechtest und die Funktion macht das fuer dich und gibt dir das Ergebnis zurueck.
    Mit dem kannst du dann machen, was du willst.
    Dein Vorschlag mit dem c-Parameter wuerde zwar theoretisch funktionieren, ist aber voelliger Schwachsin. Damit bringst du die Funktion dazu, Informationen zu verlangen, die sie ueberhaupt nicht benoetigt.
    Das ist dasselbe, als wuerdest du jemanden fragen, ob er dir das Ergebnis von 3 mal 4 sagen koennte, er dich nach dem Ergebnis fragt, deine Antwort ignoriert, deine Aufgabe berechnet und dir dann das Ergebnis sagt? Macht das Sinn? Nein.
    Manchmal ist es notwendig, von einer Funktion mehrere verschiedene Werte zurückzubekommen.
    Die Funktion gibt aber nur einen Wert zurück.
    Ggf. kann man dann ein Array oder ein Objekt zurückgeben, das mehrere Werte enthält.

    Man kann aber auch die ByRef-Übergabe verwenden.
    Ich konstruiere mal was zum Thema Mwst-Berechnung

    VB.NET-Quellcode

    1. Function BruttoBetrag (ByVal NettoBetrag as Double, Optional ByRef SteuerBetrag as Double = 0) As Double
    2. SteuerBetrag=NettoBetrag * 0.19
    3. Return NettoBetrag + SteuerBetrag
    4. End Function
    Gibt als Funktionswert den Bruttobetrag incl. Mehrwertsteuer zurück.
    Wenn dich der Steueranteil auch noch interessiert, kannst du als Steuerbetrag eine Variable vom Typ Double übergeben und in der aufrufenden Funktion weiterverwenden.

    Ob es noch elegantere Varianten gibt, so ein Problem zu lösen lassen wir mal im Raum stehen.
    Aber so funktioniert's jedenfalls auch.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Machen wir doch mal ein sinnvolles Beispiel, wenn nämlich eine Codierungsrichtlinie festlegt, dass ausschließlich Fehlercodes returnt werden dürfen.
    Dann muss die Prozedur so aussehen:

    VB.NET-Quellcode

    1. Internal Function TueEtwas(ByVal a As Integer, ByVal b As Integer, ByRef c As Integer) As FEHLER_KENNUNG
    2. If (a * b) < 0 Then
    3. Return KENNUNG_FÜR_DEN_FEHLER_NEGATIVER_RADIANT
    4. End If
    5. c = Math.Sqrt(a * b)
    6. Return ALLES_I_O
    7. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!