Class Bertl added
Dependencies: HCSR
Dependents: BERTL_ButtonLeds Bertl_Arbeit FollowLine SerialPC ... more
Fork of ur_Bertl by
Funktionen und Parameter
Eine Funktion hat einen festgelegten Aufbau:
Datentyp Funktionsname(Parameterliste) { Vereinbarungen Anweisungen return (Rückgabewert) optional }
- Die runden Klammern bei nach den Funktionsnamen müssen stehen, damit der Funktionsname zur Funktion wird.
- Die Parameterliste in den runden Klammern ist optional, d.h. sie muss nur vorhanden sein, wenn der Funktion wirklich Parameter übergeben werden. Andernfalls ist als Platzhalter void anzugeben.
- Die Parameterliste enthält sowohl die Namen als auch die Typdeklarationen der Parameter.
- Die Vereinbarungen und Anweisungen der Funktion erfolgen im sog. Funktionskörper ("body"), er muss durch geschweifte Klammern eingeschlossen sein.
- Die return-Anweisung darf an beliebiger Stelle im Funktionskörper stehen, mit ihr erfolgt der unmittelbare Rücksprung in die aufrufende Funktion oder ins Hauptprogramm.
- Der Rückgabewert hinter der return-Anweisung wird meist in runde Klammern eingeschlossen. Dies ist aber nicht notwendig. Fehlt der Rückgabewert, so wird an die aufrufende Funktion auch kein Wert zurückgegeben.
- Der Rückgabewert muss mit dem Datentype der Funktion im Funktionskopf kompatibel sein (z.B. Rückgabewert ist Integer 23
> int func()) - Die return-Anweisung kann auch ganz fehlen, dann erfolgt der Rücksprung in die aufrufende Funktion beim Erreichen des Funktionsendes (der schließenden geschweiften Klammer um den Funktionkörper); Solche Funktionen werden auch als Prozeduren bezeichnet.
Parameterliste
- Die Parameterdefinition in der Parameterliste einer Funktion gleicht einer Variablendefinition.
- Der Datentyp der Parameter ist wichtig, um zu prüfen, ob die Aufrufparameter mit den Parametern der Funktion auch kompatibel sind.
- Über die Parameternamen wird von innen aus der Funktion heraus auf die Parameter zugegriffen, wie bei lokalen Variablen.
Variable Die formalen Parameter sind aus Sicht der Funktion ganz gewöhnliche lokale Variable, in die beim Funktionsaufruf der aktuelle Parameter (aktuelle Wert) des Aufrufers hineinkopiert worden ist. Da hier eine Kopie angefertigt wird, greift die Funktion nicht auf die übergebenen Variablen zu. Die Funktion kann lediglich mit der lokale Variable arbeiten: Diese Variable kann innerhalb der Funktion gelesen und verändert werden. Die Änderungen an der Variablen sind allerdings nicht in der rufenden Funktion sichtbar. Werte-Parameter (call by value) Der Aufrufer merkt nicht, was in der Funktion mit der Variablen geschieht. Der Wert, der bei einem Aufruf an die Funktion übergeben wird, wird kopiert. So ist es möglich, auch eine Konstante als Parameter zu übergeben.
Abb
Ablauf: 1. Eine Kopie der Variable wird auf dem Stack abgelegt. 2. Zum Zeitpunkt des Aufrufs der Funktion wird ein Wert vom Stack an den formalen Parameter übergeben. 3. Die Veränderung der Kopie (am Stack) innerhalb der Funktion hat keine Auswirkung auf die ursprüngliche Variable (hat eine andere Adresse) Rückgabewerte (return) Return kann dazu verwendet werden um einen Wert an die aufrufende Funktion zurück zu geben. In der obigen Abbildung wird eine Kopie des Ergebnisses (z.B.: return 0) an die Variable ergebnis der aufrufenden Funktion übergeben. Sollen mehrere Werte an die aufrufende Funktion zurück gegeben werden so muss dies mit den Referenz-Parametern erfolgen
Referenz-Parameter (call by reference) Referenz-Parameter (formaler Parameter mit einem kaufmännischen und: &) haben den Zweck, Ergebnisse aus einer Funktion der aufrufenden Funktion zur Verfügung zu stellen (Output-Parameter). In den meisten Programmiersprachen können die Referenz-Parameter auch als Werte-Parameter verwendet werden.
Abb Ablauf: 1. Die Adresse der Variable wird am Stack abgelegt. 2. Beim Aufruf der Funktion wird die Adresse vom Stack also die ursprüngliche Variable selbst verwendet (gleiche Adresse-siehe Debugger). 3. Eine Änderung der Variablen innerhalb der Funktion ändert auch die ursprüngliche Variable in der aufrufenden Funktion. 4. Im Aufruf können daher nur Variablen stehen, die vom selben Typ bzw. konvertierbar sind.
Natürlich können mehrere Parameter verwendet werden:
int testfunktion(int para1, float para2, char para3) // Funktionsdefinition ergebnis = Testfunktion(in, fl, ch); // Funktionsaufruf
WICHTIG: Anzahl, Reihenfolge und Datentyp der jeweiligen Parameter müssen übereinstimmen.