Funktionen

 

Um größere Programme zu strukturieren, teilt man sie in mehrere Unterfunktionen auf. Dies erhöht nicht nur die Lesbarkeit, sondern erlaubt es Programmanweisungen, die mehrfach vorkommen, in Funktionen zusammenzufassen. Ein Programm besteht immer aus der Funktion "main", die als allererstes gestartet wird. Danach kann man von main aus andere Funktionen aufrufen. Ein einfaches Beispiel:

 

Sub func1()

    ' Anweisungen in Funktion func1

    .

    .

End Sub

 

Sub main()

    ' die Funktion func1 wird zweimal aufgerufen

    func1()

    func1()

End Sub

 

Parameterübergabe

 

Damit Funktionen flexibel nutzbar sind, kann man sie parametrisieren. Hierfür werden in der Klammer nach dem Funktionsnamen die Parameter für die Funktion durch Komma getrennt übergeben. Man gibt ähnlich wie in der Variablendeklaration erst den Parameternamen, und danach den Datentyp an. Will man keinen Parameter übergeben, so läßt man die Klammer leer. Ein Beispiel:

 

Sub func1(param1 As Word, param2 As Single)

    Msg_WriteHex(param1)  ' den ersten Parameter ausgeben

    Msg_WriteFloat(param2)  ' den zweiten Parameter ausgeben

End Sub

 

Wie lokale Variablen sind übergebene Parameter nur in der Funktion selber sichtbar.

 

Um die Funktion func1 mit den Parametern aufzurufen, schreibt man beim Aufruf die Parameter in der gleichen Reihenfolge, wie sie bei func1 definiert wurden. Bekommt die Funktion keine Parameter, läßt man die Klammer leer.

 

Sub main()

    Dim a As Word

    Dim f As Single

 

    func1(128,12.0)  ' man kann numerische Konstanten übergeben ...

    a=100

    f=12.0

    func1(a+28,f) ' oder aber auch Variablen und sogar numerische Ausdrücke

End Sub

 

Man muss bei dem Aufruf einer Funktion immer alle Parameter angeben. Folgende Aufrufe wären unzulässig:

 

func1()        func1 bekommt 2 Parameter!

func1(128)     func1 bekommt 2 Parameter!

 

 

Rückgabeparameter

 

Es ist nicht nur möglich, Parameter zu übergeben, eine Funktion kann auch einen Rückgabewert haben. Den Datentyp dieses Wertes gibt man bei der Funktionsdefinition hinter der Parameterliste der Funktion an.

 

Sub func1(a As IntegerAs Integer

    Return a-10

End Sub

 

Der Rückgabewert wird innerhalb der Funktion mit der Anweisung "Return Ausdruck" angegeben. Hat man eine Funktion ohne Rückgabewert, so muss man die Return Anweisung ohne Parameter anwenden, um die Funktion zu verlassen.

 

 

Referenzen

 

Da es nicht möglich ist, Arrays als Parameter zu übergeben, kann man auf Arrays über Referenzen zugreifen. Dafür schreibt man in der Parameterdeklaration einer Funktion das Attribut "ByRef" vor den Parameternamen:

 

Sub StringLength(ByRef str As CharAs Integer

    Dim i As Integer

 

    i=0

    Do While str(i)

        i=i+1  ' wiederhole solange Zeichen nicht null

    End While

    Return i

End Sub

 

Sub main()

    Dim Len As Integer

    Dim Text(15As Char

 

    Text="hallo welt"

    Len=StringLength(Text)

End Sub

 

In main wird die Referenz von Text als Parameter an die Funktion StringLength übergeben. Ändert man in einer Funktion einen normalen Parameter, so ist die Änderung außerhalb dieser Funktion nicht sichtbar. Bei Referenzen ist dies anders. Über den Parameter str kann man in StringLength den Inhalt von text ändern, da str nur eine Referenz (ein Zeiger) auf die Array Variable text ist.

 

Man kann zur Zeit nur Arrays "by Reference" übergeben!

 

 

Zeigerarithmetik

 

In der aktuellen C-Control Pro Software ist auch Arithmetik auf einer Referenz (Zeiger) erlaubt, wie das folgende Beispiel zeigt. Die Arithmetik ist auf Addition, Subtraktion, Multiplikation und Division beschränkt.

 

Sub main()

    Dim Len As Integer

    Dim Text(15As Char

 

    Text="hallo welt"

    Len=StringLength(Text+2*3)

End Sub

 

Die Zeigerarithmetik ist zur Zeit experimentell und kann eventuell noch Fehler enthalten.

 

 

Strings als Argument

 

Seit Version 2.0 der IDE kann man nun Funktionen mit einem String als Argument aufrufen. Die aufgerufene Funktion bekommt die Zeichenkette als Referenz übergeben. Da aber Referenzen im RAM stehen müssen, und vordefinierte Zeichenketten im Flashspeicher stehen, erzeugt der Compiler intern vor Aufruf der Funktion einen anonymen Speicherplatz auf dem Stack und kopiert die Daten aus dem Flash dorthin.

 

Sub StringLength(ByRef str As CharAs Integer

....

End Sub

 

Sub main()

    Dim Len As Integer

 

    Len=StringLength("hallo welt")

End Sub