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
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
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?
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)
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.