hallo, ich arbeite gerade ein Übungsbuch zu VB2008 durch. dabei ist mir aufgefallen, dass Funktionen ein Variablentyp zugewiesen wird: Function MyFunc () as Integer Was ich daran nicht verstehe, wieso wird einem Objekt (MyFunc) ein Variablentyp zugewiesen? Eigentlich sollte es doch ausreichen den Input- / Output Variablen den Variablentyp zuzuweisen: Function MyFunc (byVal Input As Integer) DIM Output As Integer Return Output End Function Hat jemand eine Erklärung für mich? Gruß, pacer
Wenn du Function MyFunc () as Integer weis der compiler das die variable die du zurückgibst ein integer sein muss.
Dürfte wie in C/C++/C# sein, eine void-Function mit einem return erzeugt wahrscheinlich eine Warnung, ein fehlendes Return mit angegebenem Datentyp ebenso. Ralf
hmm, dass was ich bei Return zurückgebe, muss ich dennoch deklarieren. In meinem Fall ist es die var 'Operand' Das Problem ist, dass beim debugging die Funktion LeseWert nicht mehr als Object sondern als Integer erkannt wird. (unter Spalte Typ) Function LeseWert() As Integer Dim Wert As String Dim Operand As Integer Wert = Console.ReadLine() 'Zeichen einlesen Operand = CInt(Wert) 'String in Integer umwandeln Return Operand End Function
Dann deklarier die Funktion halt als Object, das müsste gehen. Probiers aus, und sag Bescheid. Wobei eine kleine Erklärung, was du haben/machen willst, hilfreich wäre, damit wir dir besser helfen können :) Was spricht denn gegen den Typ Integer? Integer ist genauso ein Objekt bzw. allgemein eine Klasse. Ralf
In VB nimmst du z.b. eine Sub,
1 | Private Sub MySub(ByRef _WertA, ByRef _WertB) |
2 | |
3 | Berechnung oder sonstiges.... |
4 | |
5 | End Sub |
hier ist keine Deklaration As Type notwenig. Und die Paramteter, die nach außen sichtbar sein sollen, übergibst du in Properys.
1 | Public Property Was ich will as z.B. Integer |
2 | |
3 | Get |
4 | Return _WertA |
5 | End Get |
6 | |
7 | Set(ByVal Value as Integer |
8 | |
9 | _WertA = Value |
10 | |
11 | End Set |
mfG
wie ich schon geschrieben habe, arbeite ich gerade ein Buch zu VB2008 durch. Die kleine Funktion soll mir einfach einen Wert einlesen den der User im Commandfenster eingibt. Funktionieren tut das soweit auch. Ich habe nur ein Verständnisproblem: Üblicherweise gibt ja eine Funktion einen Wert zurück, nämlich den Wert der hinter RETURN steht. Diesen muss ich aber innerhalb der Funktion mit 'Dim Operand As Integer' deklarieren, sonst beschwert sich der Compiler. Wenn ich damit aber schon den Rückgabeparameter deklariert habe, was deklariere ich dann mit 'Function LeseWert() As Integer'? Wenn ich damit den Rückabeparameter deklariere, dann tue ich das ja sozusagen zweimal, wobei ich aufpassen muss, dass in beiden Fällen der gleiche Typ zugewiesen wird. Zumal mir unklar ist, wie das aussieht, wenn man mehrere Rückgabeparameter mit verschiedenen Typen hat. Beschweren tut sich der Compiler erst dann, wenn ich die 'Option Strict' einschalte. Mir ist klar, dass die Verwendung des Typs Object problematisch ist.
> Üblicherweise gibt ja eine Funktion einen Wert zurück, > nämlich den Wert der hinter RETURN steht. Richtig. > Diesen muss ich aber innerhalb der Funktion mit > 'Dim Operand As Integer' deklarieren, Nein. Niemand zwingt Dich, den Rückgabewert einer Funktion vor der Rückgabe einer Variablen zuzuweisen. Du könntest genausogut den Rückgabewert einer anderen Funktion, eine Konstante oder das Ergebnis einer Berechnung zurückgeben: Function LeseWert() As Integer Dim Wert As String Wert = Console.ReadLine() Return CInt(Wert) End Function > was deklariere ich dann mit 'Function LeseWert() As Integer'? Das dürfte jetzt klar sein, oder?
nö, leider noch nicht ganz. Was ist wenn mehrere Werte zurückgegeben werden sollen?
Funktionen geben immer nur einen Wert zurück, egal, in welcher Programmiersprache. Funktionen können aber mehrere Werte verändern, indem man als Argument der Funktion eine Referenz bzw. einen Pointer auf die betreffenden Variablen übergibt. Das heißt dann "call-by-reference". Hier mal die Funktion LeseWert mit zwei Änderungen: - Das Ergebnis wird als Referenz übergeben - Die Funktion hat keinen Rückgabwert Der Spezialfall "Funktion ohne Rückgabewert" wird in Basic Prozedur genannt. Procedure LeseWert(ByRef Ergebnis As Integer) Dim Wert As String Wert = Console.ReadLine() Ergebnis = CInt(Wert) End Procedure Und so wird so etwas aufgerufen: Dim Bla as Integer; LeseWert(Bla)
Wegen dem zweimal deklarieren:
1 | Function LeseWert() As Integer |
2 | ... 'nötige Variablen |
3 | |
4 | ... 'mache irgendwas |
5 | LeseWert = 12345 ' <- Der Funktionsname ist wie eine Variable |
6 | ... 'mache nochwas |
7 | |
8 | return(LeseWert) |
9 | End Function |
Der Funktionsname verhält sich wie eine Variable, kann also direkt
benutzt werden, das zweimal deklarieren (Funktion und Rückgabevariable)
entfällt also.
> Was ist wenn mehrere Werte zurückgegeben werden sollen?
Mehrere Werte können wie in C(++/#) nicht über 'return' zurückgegeben
werden, aber du kannst ein Array zurückgegeben, bzw. mittels Pointern
die entsprechenden Variablen verändern, je nachdem, was grad geschickter
ist.
Ralf
Okay, mit diesen Erklärungen hab ich es verstanden. Dass eine Funktion immer nur einen Wert zurückgeben kann, war mir so nicht klar. Auch das ich den Namen der Funktion als Rückgabewert nutzen kann, wusste ich nicht, wie ich übrigens finde, der bessere Weg. Wenn man über beide Punkte Bescheid weiß, dann erkennt man die Logic dahinter, toll :-) 'call-by-reference' wird wohl im nächsten Kapitel kommen. Danke nochmal für die Hilfe :-)
Am Rande: pacer wrote: > Dass eine Funktion immer nur einen Wert zurückgeben kann, war mir so > nicht klar. Deine Zweifel sind auch berechtigt, das ist nicht immer so. In einigen Sprachen z.B. gibts Tupel, da geht dann sinngemäß (sinngemäß!) auch:
1 | function machwas() { |
2 | return 1, 2, 3; |
3 | } |
4 | |
5 | int a, b, c; |
6 | a, b, c = machwas(); |
7 | |
8 | a, b, c = c, b, a; |
LUA kann solche Spielereien beispielsweise. > Auch das ich den Namen der Funktion als Rückgabewert nutzen > kann, wusste ich nicht, wie ich übrigens finde, der bessere Weg. Jein, in Delphi/Pascal zum Beispiel muss man den Rückgabewert entweder 'an die Funktion zuweisen' oder alternativ an die Variable 'Result'. Wenn man in der Funktion an zehn Stellen etwas zurückgibt und dabei immer an die Funktion zuweist, gibts mächtig Spaß, wenn sich der Name der Funktion mal ändern muss :-) Da ist die 'Result'-Variable schon praktischer. Auch dient das 'return()', ja nicht nur, um den Rückgabewert zu bestimmen, sondern es bewirkt ja gleichzeitig noch einen Rücksprung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.