C-Tutorial Kapitel 6


Aus Wirthi's Wiki

Wechseln zu: Navigation, Suche
C-Tutorial
Allgemeines
Kapitel 1 (Einleitung)
Kapitel 2 (Blöcke)
Kapitel 3 (Daten)
Kapitel 4 (Kontrollanweisungen)
Kapitel 5 (Ein- und Ausgabe)
Kapitel 6 (Unterprogramme)
Kapitel 7 (Felder und Strukturen)
Kapitel 8 (Zeiger)

Inhaltsverzeichnis

Im 6. Kapitel werden sogenannte Unterprogramme beschrieben.

[bearbeiten] Unterprogramme

Stellen Sie sich vor, Sie haben einen eine Code-Folge, die mehrmals im Programm vorkommt, etwa eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben (was Zeit beim Erstellen und Speicherplatz im ausführbaren Programm kostet), können Sie den Abschnitt in ein sogenanntes "Unterprogramm" schreiben. Dieses Unterprogramm können Sie dann von jeder Stelle ihre Hauptprogrammes aus aufrufen.

Anders als in anderen Programmiersprachen gibt es in C keine generelle Unterscheidung zwischen Funktionen und Prozeduren. Trotzdem möchte ich kurz darauf eingehen:

[bearbeiten] Funktionen

Syntax: Rückgabe-Typ Name(Parameterliste);

Funktionen sind Unterprogramme, die am Ende der Ausführung einen Wert zurückliefern, wie z.B. getch. Paradebeispiele für die Anwendung einer Funktion sind jedoch mathematische Formeln:

#include <stdio.h>

int hoch2(int param1)
{
  int zahl;
  zahl=Param1*Param1;
  return zahl;
}

void main(void)
{
  int zahl1,ergebnis;
  printf("Bitte Zahl eingeben: ");
  scanf("%d",&zahl1);
  ergebnis:=hoch2(zahl1);
  printf("%d hoch 2 = %d\n",zahl1,ergebnis);
  printf("5 hoch 2 = %d\n",hoch2(5));
  getch();
}
Erklärung
  • Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur außerhalb von Blöcken. Siehe auch Prototypen.
  • Geschachtelte-Unterprogramme wie z.B. in Pascal sind nicht möglich.
  • In der Deklaration der Funktion kommt zuerst der Rückgabe-Datentyp. Jede Funktion liefert einen Wert zurück, dieser Datentyp gibt den Typ der Varaiblen an. Bei z.B. getch ist das char. Danach folgt der Name der Funktion (case-sensitiv!). Danach kommt die Parameter-Liste. Dabei handelt es sich um eine Liste von Parametern, die jeweils durch Typ und Name angegeben werden, und eventuell mittels Beistrich voneinander getrennt werden. Am Ende ist kein Beistrich!
  • Im Block der Funktion können alle Anweisungen ausgeführt werden und Variablen deklariert werden.
  • Am Ende der Funktion muß diese ordnungsgemäß beendet werden. Dies geschieht mittels der Anweisung "return" und dem Rückgabewert.
  • Um eine Funktion aufzurufen (aus einem anderen Unterprogramm oder main), geben Sie folgendes an "Variable=Funktion(Parameter);". Bei Variable muß es sich jedoch nicht unbedingt um eine von Ihnen deklarierte Variable handeln. Es kann z.B. auch der Parameter für ein weiteres Unterprogramm sein (wie im Beispiel, letzte Zeile).
  • Die Einrückungen der Anweisungen innerhalb der Funktion nach rechts ist nicht notwendig, sie dient jedoch der Übersicht und ist sehr empfehlenswert.

[bearbeiten] Prozeduren

Syntax: void Name(Parameterliste);

Eine Prozedur ist nichts anderes als eine Funktion ohne Rückgabewert. Sie ist daher prinzipiell gleich aufgebaut wie eine Funktion, bis auf die folgenden Unterschiede:

  • Als Rückgabe-Datentyp wird void angegeben.
  • Eine Prozedur kann daher beim Aufruf nicht einer Variablen zugewiesen werden (wie Funktionen) sondern wird wie eine normale Anweisung behandelt (wie beispielsweise printf).
#include <stdio.h>

void ausgeben(int Param1);
{
  printf("Der Wert der Variablen beträgt: %d\n",Param1);
}

void main(void)
{
  int Zahl1;
  ausgeben(23);
  Zahl1=4;
  ausgeben(Zahl1);
  getch();
}
Erklärung
  • Durch den Befehl "ausgeben(23)" wird die Prozedur "ausgeben" mit dem Parameter 23 aufgerufen. Param1 hat also den Wert 23. Die einzige Anweisung innerhalb der Prozedur ist printf, was nun ausgeführt wird.
  • Danach wird mit dem nächsten Befehl innerhalb des Hauptprogrammes fortgefahren ("Zahl1=4").
  • Der 2. Aufruf von ausgeben erfolgt mit dem Parameter Zahl1, also wird Param1 der Wert 4 zugewiesen. Dieser wird nun wieder mittels printf ausgeben.

[bearbeiten] Unterprogramme ohne Parameter

Das ist ihnen sicherlich schon aufgefallen: Viele Unterprogramme, z.B. main, haben statt der Parameter immer nur void stehen. Was bedeutet das? Nun ja, C erwartet, dass Sie die Parameter angeben. void bedeutet "es gibt keine Parameter". "void main(void)" bedeutet also: "Erstelle ein Unterprogramm Namens main, das keinen Rückgabewert und keine Parameter hat".

ACHTUNG! Auch wenn eine Funktion keine Parameter hat, etwa getch, müssen Sie beim Aufruf trotzdem die Klammern angeben. Der Befehl "getch;" führt nicht getch ohne Parameter aus, sondern liefert die Adresse der Funktion getch (eingen sogenannten function pointer). Es ist daher wichtig, bei jedem Aufruf eines Unterpgrogramms Klammern anzugeben.

[bearbeiten] Prototypen

Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muss in der Datei oberhalb des ersten Aufrufes definiert worden sein. Wenn ein Unterprogramm in Zeile 10 zum ersten Mal aufgerufen wird, muss die Definition bereits davor erledigt worden sein.

Um dies zu erreichen, gibt es zwei Möglichkeiten:

  • Sie schreiben alle Unterprogramme vor main in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind.
  • Wo dies nicht möglich ist (etwa sich selber aufrufende, sogenannte rekursive Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden.

Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. "void up1(char Zeichen)") und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). Beachten Sie jedoch, dass Prototypen einen Strichpunkt am Ende haben!

#include <stdio.h>

void ausgeben(int Zahl);  //Der Prototyp

void main(void)
{
  ausgeben(12);
  getch();
}

void ausgeben(int Zahl)   //Die eigentliche Prozedur
{
  printf("Ausgabe: %d\n",Zahl);
}
Erklärung
  • Hier wird zuerst der Prototyp der Prozedur ausgeben definiert.
  • In main wird die Prozedur verwendet, ohne bereits implementiert zu sein.
  • Erst danach folgt der Code von ausgeben.
Allgemeines - Kapitel 1 - Kapitel 2 - Kapitel 3 - Kapitel 4 - Kapitel 5 - Kapitel 6 - Kapitel 7 - Kapitel 8

Persönliche Werkzeuge