Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Anfängerkurs Teil 4 - Unterprogramme

von RedakteurytwinkySeite 1 von 2

Gliederung von Programmen

Der klassische Ansatz zur Gliederung von Programmen ist das sogenannte 'EVA'-Prinzip.
E - Eingabe
V - Verarbeitung(der Eingabe), Berechnung
A - Ausgabe(der berechneten Werte und der Eingaben)
Der Ursprung dafür liegt in alten Rechnerkonzepten begründet, wo die Benutzer nur zeitweise Zugang zu Rechnern hatten und eine interaktive Mitwirkungsmöglichkeit nicht vorgesehen war (Stichwort: Lochkarteneingabe).
Der moderne Rechnerbetrieb mit ständiger Verfügbarkeit erfordert eine andere Herangehensweise.

Ein möglicher Ansatz zur Aufteilung von Programm ist die Einteilung in Hauptprogramm und Unterprogramme(UP).
Dabei übernimmt das Hauptprogramm die Steuerung(besser gesagt: die Verwaltung) des Programmes, der Rest wird vom Hauptprogramm aus aufgerufen oder ruft sich gegenseitig auf.

Bei den UP werden grundsätzlich zwei Typen unterschieden:
1. UP, die einen Wert zurückliefern, sie werden Funktionen (engl. FUNCTION) genannt(z.B. Abs(), liefert den Absolutbetrag des übergebenen Wertes)
2. UP, die einfach bestimmte Anweisungsfolgen ausführen (und keinen Wert zurückliefern), das sind die SUBs (von engl. SUBroutine)
Beiden Typen können Parameter übergeben werden und beide können(falls erforderlich) auch Werte im Hauptprogramm oder anderen zugänglichen Bereichen ändern.

Diese UP haben immer einen Namen, über den sie aufgerufen werden. Der immer noch vorhandene Call-Befehl ist hierfür nicht nötig.
So sind sie vielseitig einsetzbar und das ist ein wesentlicher Vorteil gegenüber Anweisungen wie BefehlsreferenzeintragGOSUB, das im BefehlsreferenzeintragStandarddialekt von FreeBASIC ohnehin bereits nicht mehr verfügbar ist, (und erst recht natürlich gegenüber BefehlsreferenzeintragGOTO, von dessen Verwendung allgemeinhin abgeraten wird).

Wer jetzt den Eindruck bekommt, daß auf diesem Weg die Sprache um eigene Befehlen erweitert werden kann, liegt nicht ganz falsch..
..und wer seine UP nun so verfaßt, daß sie in verschiedenen Programmen als Bausteine verwendet werden können(Stichwort: Dateiein- und -ausgabe), erhält sehr schnell eine Sammlung von Spracherweiterungen.
Diese können als Quellcode zur Verfügung gestellt werden, oder aber zusammengefaßt als Library(~Bibliothek). Da dies aber ein sehr komplexes Thema ist, wird es in einem eigenen Kapitel behandelt werden.
Das ist sehr trocken, betrachten wir also ein Beispiel:
Eine SUB soll zwei Zahlen a und b addieren und das Ergebnis in c zurückliefern.

Dim As Integer a, b, c 'die drei Variablen deklarieren
Input "Summand1=", a
Input "Summand2=", b
GoSub Addieren
Print "Summe=" &c
Sleep
End

Addieren:
  c=a+b
Return

Das geht doch astrein, wo ist dann der Haken? Ganz einfach, egal, von wo aus ich das Programm aufrufe, es werden immer a und b addiert und es wird immer der Wert von c berechnet. Das ist aber manchmal überhaupt nicht erwünscht und falls der Wert von c noch gebraucht wird, muß er in eine andere Variable umgespeichert werden..
Mit einer Sub sähe das so aus:

Declare Sub Addieren(byVal Summand1 As Integer, byVal Summand2 As Integer, byRef Summe As Integer)
Dim As Integer a, b, c, d
Input "Summand1=", a
Input "Summand2=", b
Addieren(a, b, c)
Print "Summe in c=" &c
Addieren(a+19, b+4, d)
Print "Summe in c=" &c
Print "Summe in d=" &d
Sleep
End

Sub Addieren(byVal Summand1 As Integer, byVal Summand2 As Integer, byRef Summe As Integer)
  Summe=Summand1+Summand2
End Sub

Das sieht ein wenig hingebogen aus, soll es ja auch, denn in Wirklichkeit würde so etwas wohl per Function gelöst werden:

Declare Function Summe(byVal Summand1 As Integer, byVal Summand2 As Integer) As Integer
Dim As Integer a, b
Input "Summand1=", a
Input "Summand2=", b
Print "Summe in c=" & Summe(a, b) 'Hier wird die Summe berechnet..
Print "Summe in d=" & Summe(a+19, b+4) 'Hier wird die Summe mit anderen Werten berechnet..
Sleep
End

Function Summe(byVal Summand1 As Integer, byVal Summand2 As Integer) As Integer
  Return Summand1+Summand2 'Summe berechnen und mit dem Ergebnis zurückkehren
  'Alternativ zur obigen Zeile, sind auch die 2 folgenden Syntaxformen möglich, gelten jedoch als veraltet:
  'Summe = Summand1+Summand2 'Summe berechnen und in der Function bleiben..
  'Function = Summand1+Summand2 'diese Zeile ist mit der darüber gleichbedeutend..
End Function 'Ende der Function, jetzt mit der Wert von Summe(oder Function) zurückkehren

Ja gut, aber was bedeuten nochmal byVal und byRef? Kein Problem:
byVal - ist die Abkürzung für by Value(also: als Wert), das UP kann mit dem Wert machen, was es will, der ursprüngliche Wert wird nicht geändert..
byRef - ist die Abkürzung für by Reference(also: als Adresse), das UP hat direkten Zugriff auf die Variable und kann sie also verändern.

 

Gehe zu Seite Gehe zu Seite  1  2  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 09.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 10.03.2020 von MitgliedJuergen gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen