Forum: PC-Programmierung Zusammenhang Funktion Variablentyp in VB 2008


von pacer (Gast)


Lesenswert?

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

von Frek (Gast)


Lesenswert?

Wenn du
Function MyFunc () as Integer

weis der compiler das die variable die du
 zurückgibst ein integer sein muss.

von Ralf (Gast)


Lesenswert?

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

von pacer (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Daniel V. (volte)


Lesenswert?

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

von pacer (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ü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?

von pacer (Gast)


Lesenswert?

nö, leider noch nicht ganz.
Was ist wenn mehrere Werte zurückgegeben werden sollen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)

von Ralf (Gast)


Lesenswert?

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

von pacer (Gast)


Lesenswert?

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 :-)

von Sven P. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.