mikrocontroller.net

Forum: PC-Programmierung Zusammenhang Funktion Variablentyp in VB 2008


Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du
Function MyFunc () as Integer

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel V. (volte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In VB nimmst du z.b. eine Sub,
Private Sub MySub(ByRef _WertA, ByRef _WertB)

Berechnung oder  sonstiges....

End Sub
hier ist keine Deklaration As Type notwenig.

Und die Paramteter, die nach außen sichtbar sein sollen, übergibst du in 
Properys.
Public Property Was ich will as z.B. Integer

Get 
Return _WertA
End Get

Set(ByVal Value as Integer

_WertA = Value

End Set

mfG

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: pacer (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegen dem zweimal deklarieren:
Function LeseWert() As Integer
  ... 'nötige Variablen

  ... 'mache irgendwas
  LeseWert = 12345  ' <- Der Funktionsname ist wie eine Variable
  ... 'mache nochwas

  return(LeseWert)
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

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
function machwas() {
  return 1, 2, 3;
}

int a, b, c;
a, b, c = machwas();

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.