Function oder Sub < BASIC < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 12:41 So 30.03.2014 | Autor: | Mathics |
Hallo,
ich habe in meinen Unterlagen ein ganz simples Programm entdeckt, bei dem ich mich frage, wieso Function und nicht Sub benutzt wurde.
´Dies Modul enthält betriebsspezifische Funktionen
´Autor: Fritz Findig, 01
´Stand: 01.10.2012
´liefert das Jahr der Betriebsgründung
Function Betriebsgruendung() As Integer
Betriebsgruendung = 1887
End Function
Hier wird wohl lediglich angegeben, dass die Betriebsgründung im Jahr 1887 war.
Als Unterschied zwischen Function und Sub habe ich gelernt, dass Function einen Wert zurückgibt.
Sub haben wir bisher immer bei Arrays angewendet. Und bei Arrays werden doch auch bestimmten Feldern einfach Werte zugeordnet. Wieso hat man oben Funktion verwendet und wieso nicht Sub? Ist das weil man bei Excel quasi nichts großartig visuell darstellt/verändert, sondern einfach einen Wert erhält? Ich mein bei Arrays hat man ja nicht für eine Variable einen bestimmten Wert, sondern man hat eine Reihe von Werten. Wie erkennt man am besten wann man Sub und wann man Function verwenden soll?
LG
Mathics
|
|
|
|
Hallo,
> ich habe in meinen Unterlagen ein ganz simples Programm
> entdeckt, bei dem ich mich frage, wieso Function und nicht
> Sub benutzt wurde.
>
> ´Dies Modul enthält betriebsspezifische Funktionen
> ´Autor: Fritz Findig, 01
> ´Stand: 01.10.2012
> ´liefert das Jahr der Betriebsgründung
> Function Betriebsgruendung() As Integer
> Betriebsgruendung = 1887
> End Function
>
> Hier wird wohl lediglich angegeben, dass die
> Betriebsgründung im Jahr 1887 war.
>
> Als Unterschied zwischen Function und Sub habe ich gelernt,
> dass Function einen Wert zurückgibt.
> Sub haben wir bisher immer bei Arrays angewendet. Und bei
> Arrays werden doch auch bestimmten Feldern einfach Werte
> zugeordnet. Wieso hat man oben Funktion verwendet und wieso
> nicht Sub? Ist das weil man bei Excel quasi nichts
> großartig visuell darstellt/verändert, sondern einfach
> einen Wert erhält? Ich mein bei Arrays hat man ja nicht
> für eine Variable einen bestimmten Wert, sondern man hat
> eine Reihe von Werten. Wie erkennt man am besten wann man
> Sub und wann man Function verwenden soll?
Wenn du bspw. eine Quadratwurzel ausrechnen lassen möchtest, dann erwartest du doch auch, dass die Zeile
b=sqrt(a)
der Variablen b die Quadratwurzel von a zuweist, indem die Funktion sqrt selbigen Wert zurückliefert.
Und das würde eben für den Fall, dass du die Funktion sqrt selbst programmieren würdest, nur klappen, wenn die Routine eine Funktion ist. Eine Prozedur (in BASIC: SUB) kann man überhaupt nicht in so eine Zuweisungsgleichung einbauen, sondern man kann sie nur direkt aufrufen, damit sie das tut, wozu sie eben da ist.
Wenn man bspw.
SUB Tatue
Beep 300,500
Beep 400,500
END SUB
schreibt, dann wird (vorausgesetzt, die Bibliotheksfunktion Beep wurde vorher ordnungsgemäß deklariert) bei dem Aufruf
Tatue
ein akkustisches Signal ausgegeben, ohne das dich dabei irgendein Rückgabewert interessiert.
In manchen Sprachen, allen voran C und C++, kennt man diese Unterscheidung überhaupt nicht, dort gibt es nur Funktionen, und eine Funktion, die nichts zurückliefert, hat dort den Typ 'void'. In Pascal und Basic hat man seinerzeit dafür eigene Strukturen eingeführt (PROCEDURE in Pascal, SUB...END SUB in Basic), und das hat sich halt bis heute gehalten, weil diese Sprachen ja auch alle genormt sind.
SUB..END SUB verwendet man also für alle Routinen, bei denen nicht unmittelbar ein Wert zurückgeliefert werden soll, sondern irgendetwas anderes getan wird wie bspw. eine Ausgabe auf dem Bildschirm, in eine Datei oder an einen Drucker.
Dein Beispiel mit den Arrays lässt sich so erklären, dass die Werte in diesen Arrays nach Aufruf der Prozedur entsprechend geändert sind, aber da wird kein Wert zurückgeliefert, sondern man kann die Werte des Arrays dann mit anderen Befehlen nach Belieben auslesen.
Gruß, Diophant
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:35 So 30.03.2014 | Autor: | Mathics |
Könnte ich also nicht
Sub x ()
Dim Betriebsgruendung As Integer
Betriebsgruendung=1887
End Sub
schreiben?
Wäre das nicht so ähnlich wie ein Array, bei dem ich z.B. schreibe
Sub algD (i As Integer)
Dim myAr (2,2) As Integer
myAr(0,0) = 1
...
Ich hätte hier ja keinen Wert für x zurückgeliefert. Oder habe ich hier noch ein Verständnisproblem/Denkfehler?
LG
Mathics
|
|
|
|
|
Hallo,
wenn du das als Sub schreibst, dann kommst du niemals an den Wert 1887. Welchen Sinn sollte das haben?
Gruß, Diophant
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:44 So 30.03.2014 | Autor: | Mathics |
Hallo,
dann habe ich immer noch ein Problem mit der Unterscheidung.
Ich habe jetzt so gedacht:
Function Betriebsgruendung() As Integer
Betriebsgruendung = 1887
End Function
Hier erhalte ich für Betriebsgründung also für meinen Programmnamen einen Wert geliefert. Deshalb ist das Function.
Sub x ()
Dim Betriebsgruendung As Integer
Betriebsgruendung=1887
End Sub
Hier erhalte ich für x keinen Wert raus, deshalb nehme ich Sub.
Aber ich liege damit höchstwahrscheinlich falsch. Ich kann mir das als absoluter Laie immer sehr schwer vorstellen, was für Abläufe da gerade passieren und deswegen denke ich, habe ich noch Schwierigkeiten den Unterschied zu verstehen.
LG
Mathics
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:10 So 30.03.2014 | Autor: | leduart |
Hallo
i.A. hat man in sub nur lokale Variable, es sei denn du erklärst Betriebsführung als global.
Wenn du spater etwa das Jahr 17 nach Betriebsprüfung haben willst, kannst du einfach Jahr= Betriebsprüfung+17 irgendwo verwenden. wenn du es in der sub hast nur wenn du es als global definiert hast (soweit es in deiner Sprache globale und lokale Variable gibt.
allerdings könnte man diese Minifunktion natürlich auch einfach durch Betriebsgründung=1887 im Hauptprogramm deklarieren.
Gruß leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:50 So 30.03.2014 | Autor: | Mathics |
Hallo,
die Unterscheidung lokal/global kenne ich in diesem Zusammenhang leider nicht. War mein Gedankengang, den ich im letzten Post geschildert habe denn falsch?
LG
Mathics
|
|
|
|
|
Hallo Mathics,
ich versuche nochmal, ein paar Dinge klarzustellen, vielleicht verstehst du dann etwas mehr.
Lang bevor sich die heute übliche objekt-orientierte Programmierung etabliert hatte, wurden die sog. strukturierten Programmiersprachen entwickelt, um bei komplexeren Projekten überhaupt noch die Lauffähigkeit eines Programms gewährleisten zu können, indem man Strukturen geschaffen hat, welche die einzelnen Aufgaben einer Software streng voneinander trennen. Diese Strukturen heißen in Basic SUB und FUNCTION. Damit diese Trennung funktionierte, war es generell so, dass Variablen, die innerhalb einer solchen Struktur deklariert werden, außerhalb der Struktur nicht existieren. Solche Variablen nennt man lokal, und das sollte heute noch Standardeinstellungen von Compilern sein, dass Variablen lokal sind, wenn sie nicht anders deklariert werden. Allerdings kann man das bei modernen Programmiersystemen wie VBA auch ändern.
Wenn nun die Variablen innerhalb einer Sub-Struktur lokal sind, dann sind sie wie gesagt von außerhalb der Struktur nicht existent und deswegen kann eine solche Prozedur keinen Wert zurückliefern.
Wenn natürlich mit globalen Variablen gearbeitet wird, dann könnte man in der Tat den fraglichen Wert nach Aufruf der Prozedur auslesen, und dein Einwand wäre dann gerechtfertigt. Allerdings ist dies ein sehr unsauberer Programmierstil, daher hatte ich diese Möglichkeit überhaupt nicht in Betracht gezogen.
Gruß, Diophant
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:06 So 30.03.2014 | Autor: | Mathics |
Hallo,
das würde also bedeuten:
Sub x ()
Dim Betriebsgruendung As Integer
Betriebsgruendung=1887
End Sub
Betriebsgründung ist hier eine lokale Variable (vgl. Deklaration mit Dim) und deshalb würde ich wenn ich außerhalb dieser Funktion den Wert für die Betriebsgründung ermitteln möchte keinen Wert erhalten.
Function Betriebsgruendung() As Integer
Betriebsgruendung = 1887
End Function
Hier wäre Betriebsgründung jedoch eine globale Variable und damit erhalte ich bei dieser Funktion einen Wert, den ich auch außerhalb jederzeit verwenden kann.
Ist das bis dahin erstmal richtig verstanden?
LG
Mathics
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:09 So 30.03.2014 | Autor: | leduart |
Ja
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:18 So 30.03.2014 | Autor: | Mathics |
Okey, dann stelle ich mir eigentlich noch diese Fragen:
Sub x ()
Dim Betriebsgruendung As Integer
Betriebsgruendung=1887
End Sub
Wäre das x eine globale Variable? Aber für x würde ich bei Sub ja auch keinen Wert bekommen. Wären bei Sub() und Function() die Werte in der Klammer globale Werte?
LG
Mathics
|
|
|
|
|
Hallo Mathics,
du musst schon die gegebenen Antworten besser durchlesen, aber irgendein Standardwerk zum Einstieg in Visual Basic wäre auch nicht schlecht. So was bekommt man in so gut wie jeder Leihbibliothek.
> Okey, dann stelle ich mir eigentlich noch diese Fragen:
>
> Sub x ()
> Dim Betriebsgruendung As Integer
> Betriebsgruendung=1887
> End Sub
>
> Wäre das x eine globale Variable?
x ist keine Variable sondern der Name deiner Sub-Struktur (Prozedur)
> Aber für x würde ich
> bei Sub ja auch keinen Wert bekommen. Wären bei Sub() und
> Function() die Werte in der Klammer globale Werte?
Das kann man so nicht sagen. Wie schon geschrieben wurde: eigentlich geht man davon aus, dass Variablen nur dann global sind, wenn sie als solche (am besten) zu Programmbeginn deklariert wurden. Dies geschieht in Visual Basic mit dem Schlüsselwort PUBLIC. Wenn du also folgendes machen würdest
PUBLIC Betriebsgruendung AS INTEGER
SUB x()
Betriebsgruendung=1887
END SUB
MsgBox Betriebsgruendung
Jetzt wird ein Fenster mit der Zahl 1887 angezeigt.
Mit SUB x()
DIM Betriebsgruendung AS INTEGER
Betriebsgruendung=1887
END SUB
MsgBox Betriebsgruendung
würde die letzte Zeile einen Fehler auslösen, weil die Variable Betriebsgruendung jetzt an dieser Stelle unbekannt ist.
Gruß, Diophant
|
|
|
|