Teil 5 „Functions“

Der C-Kurs
Antworten
Benutzeravatar
bodo
User
Beiträge: 319
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Teil 5 „Functions“

Beitrag von bodo » 10.11.2008, 19:23

C für BASIC-Programmierer

Arbeiten mit dem z88dk Cross-Compiler

von Jens Sommerfeld und Bodo Wenzel

Teil 5

Wir sind gerade so schön am Berechnen, da kommt das Kapitel 5 „Functions“ gerade richtig. Funktionen sind in C nicht nur die Methode, mathematische Abbildungen durchzuführen; das Konzept geht noch viel weiter. Darauf kommen wir aber erst im Teil 14 zurück, bis dahin müsst ihr euch gedulden...

C als Sprache hat keine eigenen Schlüsselworte für mathematische Funktionen. Wenn ihr euch die Liste der Schlüsselworte aus Teil 2 nochmal anseht, wird das klar. Stattdessen werden Funktionen als Unterprogramme in sogenannten Bibliotheken zur Verfügung gestellt. In üblichen C-Umgebungen und damit auch bei z88dk braucht ihr euch darum kaum zu kümmern. Die Wortwahl „kaum“ hat zwei Gründe:
  1. Bevor eine Funktion aufgerufen werden kann, sollte sie dem Compiler bekannt sein. Dies erreicht ihr durch die Angabe der entsprechenden #include‑Zeile, die wir später genauer erläutern.
  2. Die mathematische Bibliothek (mit Sinus, Logarithmus, usw.) zum Beispiel gehört nicht zum automatischen Standard, deshalb muss sie außerdem extra zum Linken angegeben werden. Dies braucht uns aber momentan nicht zu sorgen, weil wir ja sowieso keine Kommazahlen benutzen können.
Bevor wir in weitere Details gehen, erst einmal ein praktisches Beispiel mit der Zufallszahlenfunktion, wie gehabt als reine printf-Zeile:

Code: Alles auswählen

    printf("Ergebnis = %d\n", rand());
Allerdings müssen wir eine weitere #include‑Zeile hinzufügen, sonst ist der Compiler unglücklich. Diese Zeile schreibt ihr direkt unter die bereits vorhandene:

Code: Alles auswählen

#include <stdlib.h>
Lasst das Programm mehrfach laufen, und ihr bemerkt, dass jedesmal ein anderer Wert ausgegeben wird. Dies liegt daran, dass rand() eine interne Variable besitzt, die durch RUN nicht gelöscht wird.

Was macht jetzt eine Funktion in C aus? Dies sind drei Dinge:
  • Der Typ des Rückgabewertes; wenn eine Funktionen nichts zurückgibt, ist dies der Typ void. C macht keinen Unterschied zwischen „Funktionen“ mit Rückgabewert und „Prozeduren“ ohne Rückgabewert.
  • Der Name der Funktion; dieser muss mit einem Buchstaben (dazu gehört auch der Unterstrich '_', aber keine Umlaute) beginnen, danach dürfen außer Buchstaben auch Ziffern folgen. C unterscheidet zwischen Groß- und Kleinbuchstaben!
  • Die Liste der Parameter; jeder Parameter hat einen Typ und einen Namen. Eine Funktion kann auch ohne Parameter definiert sein.
Diese Deklaration einer Funktion ist sozusagen der Fußabdruck; er wird auch als Prototyp bezeichnet. Für die oben benutzte Zufallszahlenfunktion lautet er:

Code: Alles auswählen

int rand(void);
Die Funktion rand() heißt also „rand“ (ach, was!), liefert einen Rückgabewert vom Typ int, und bekommt beim Aufruf keine Parameter. Es ist üblich, eine solche leere Parameterliste mit void deutlich zu machen.

Die Funktion zum Entfernen eines Vorzeichens heißt abs(). Sie bekommt einen int als Parameter, dessen Vorzeichen wird durch die Statements der Funktion entfernt, und der zurückgegebene Wert ist dann vorzeichenlos und vom Typ int. Der dazugehörige Prototyp sieht so aus:

Code: Alles auswählen

int abs(int value);
Ihr könnt diese Funktion einfach ausprobieren:

Code: Alles auswählen

    printf("Ergebnis 1 = %d\n", abs(-123));
    printf("Ergebnis 2 = %d\n", abs(+123));
Beim Aufruf einer Funktion müssen immer Klammern gesetzt werden! Wenn ihr sie weglasst, ist das auch ein gültiger C-Ausdruck. Allerdings besitzt er den Wert der Adresse der Funktion, und es erfolgt kein Aufruf. Das könnt ihr natürlich einmal ausprobieren:

Code: Alles auswählen

    printf("Ergebnis = %d\n", rand);
Eine komplette Liste aller möglichen Funktionen kann an dieser Stelle nicht gegeben werden, weil es eben vom Umfang und der Anzahl der Bibliotheken abhängt, welche Funktionen zur Verfügung stehen. Allerdings gibt es einige Standards, die in allen C‑Büchern aufgeführt sind. Wir werden im Rahmen dieses Kurses einige Funktionen kennenlernen, und sicher könnt ihr im Forum auch mehr erfahren.

Wer ganz neugierig ist, kann sich die diversen Dateien mit der Erweiterung „*.h“ im Verzeichnis „include“ der z88dk-Installation ansehen. Dies sind reine Textdateien, die u.a. auch jede Menge Funktionsprototypen enthalten. Ansonsten müssen wir auf die Dokumentation des z88dk verweisen, die in einem Wiki (http://www.z88dk.org/wiki/doku.php) im Internet vorliegt. Dort sind zumindest ansatzweise viele Funktionen dargestellt.

Zusammenfassung:
  • Funktionen sind die Unterprogramme in C.
  • Eine Funktion hat immer einen Namen, einen Typ, der void sein kann, und eine Parameterliste, die leer sein kann.
  • Namen müssen mit einem Buchstaben beginnen; Groß- und Kleinbuchstaben werden unterschieden.
  • Vor dem Aufruf einer Funktion muss der Compiler den Prototyp kennen. Bei Standardfunktionen wird dies durch die passende #include‑Zeile erreicht.
Hausaufgaben
  1. Welche der folgenden Funktionsnamen sind nicht zulässig?
    super_funktion
    3fach
    wieviel?
    _
    schätzen
  2. Das folgende Programm ist fehlerhaft. Finde den Fehler, ohne es einzugeben und zu compilieren. Erst dann benutze den Compiler.

    Code: Alles auswählen

    #include <stdio.h>
    
    int main(void);
    {
        printf("Ergebnis = %d\n", 1 + 2);
        return 0;
    }
  3. Auch main() hat einen „Fußabdruck“, und wir schreiben ja auch immer das return‑Statement hin. Damit können wir einen Wert an das BASIC zurückgeben. Schreibe ein Programm, das sein Rechenergebnis (z.B. eine Zufallszahl) zurückgibt. Der zurückgegebene Werte soll dann durch eine BASIC‑Anweisung ausgegeben werden.
B0D0: Real programmers do it in hex.

Antworten