Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste


C - Programmierung am Raspberry  Schaltpläne und Bauteilbeschreibungen  Adapterkabel  Mechanik  EDV-Literatur deutsch 



    FIAN Österreich     Marktplatz Natur    
    Bäckerei Freitag

capt06

Kapitel sechs - Funktionen

Funktionen - wie Sie Ihren Code in einfache, mundgerechte Teile aufteilen können …

Bisher hatten alle Beispiele, die wir uns angesehen haben, eine einzige Funktion, main, mit dem gesamten Code. Dies gilt perfekt für kleine, einfache Programme, ist jedoch nicht wirklich praktisch, wenn Sie mehr als ein paar zehn Zeilen erhalten, und es ist Platzverschwendung, wenn Sie dasselbe mehrmals ausführen müssen. Die Aufteilung des Codes in separate Funktionen macht ihn lesbarer und ermöglicht eine einfache Wiederverwendung.

Wir haben bereits gesehen, dass Funktionen verwendet werden. Die Hauptfunktion ist eine Standard-C-Funktion, allerdings mit einem speziellen Namen. Wir haben auch die printf-Funktion gesehen, die in unseren Beispielen aufgerufen wird. Wie erstellen und nutzen wir eine eigene Funktion? Hier ein Beispiel:

#include <stdio.h>
 
int sum (int a, int b)
{
  int res;
  res = a + b;
  return res;
}
 
void main (void)
{
  int y = 2;
  int z = sum (5, y);
 
  printf ("Die Summe von 5 und %d ist %d\n", y, z);
}
[ARGUMENTE]
Eine Funktion kann eine beliebige Anzahl von Argumenten haben, von Null bis zu Hunderten. Wenn Sie keine Argumente benötigen, listen Sie die Argumente in der Funktionsdefinition als (void) auf (genau wie in der Hauptfunktion). Wenn Sie die Funktion aufrufen, setzen Sie einfach ein Paar leere runde Klammern () nach den Funktionsnamen.

Dies umfasst sowohl die main Funktion als auch eine zweite Funktion namens sum. In beiden Fällen ist die Struktur der Funktion dieselbe: eine Zeile, die den von der Funktion zurückgegebenen Wert, den Funktionsnamen und die Funktionsargumente definiert, gefolgt von einem Codeblock in geschweiften Klammern.

Was ist in einer Funktion?

Schauen wir uns die sum Funktion an:

  int sum (int a, int b)

Die Definition einer Funktion besteht aus drei Teilen. Der erste Teil ist der Typ des von der Funktion zurückgegebenen Werts: in diesem Fall ein int. Der zweite Teil ist der Name der Funktion: in diesem Fall sum. Schließlich stehen in runden Klammern die Argumente für die Funktion, die durch Kommas getrennt sind, und jedes wird mit seinem Typ angegeben: in diesem Fall zwei ganzzahlige Argumente, a und b.

Der Rest der Funktion befindet sich zwischen den geschweiften Klammern.

  int res;

Dies deklariert eine lokale Variable für die Funktion, eine Ganzzahl namens res. Dies ist eine Variable, die nur lokal innerhalb der Funktion selbst verwendet werden kann. Innerhalb einer Funktionsdefinition deklarierte Variablen können nur innerhalb dieser Funktion verwendet werden. Wenn Sie versuchen, res innerhalb der Hauptfunktion zu lesen oder zu schreiben, wird eine Fehlermeldung angezeigt. (Sie könnten innerhalb der Hauptfunktion ein anderes int mit dem Namen res deklarieren, dies wäre jedoch eine andere Variable mit dem Namen res als die innerhalb der sum Funktion und würde sehr verwirrend werden, daher wird dies nicht empfohlen!)

[VARIABLER ANWENDUNGSBEREICH]
Wenn Sie eine Variable innerhalb einer Funktion deklarieren, kann sie nur innerhalb dieser Funktion verwendet werden, nicht innerhalb von Funktionen, die die Funktion aufrufen, oder innerhalb von Funktionen, die von der Funktion aufgerufen werden. Das wird als Gültigkeitsbereich einer Variablen bezeichnet: die Teile des Codes, in denen sie gültig ist.
  res = a + b;

Das sollte klar sein! Beachten Sie, dass a und b die beiden definierten Argumente der Funktion sind. Wenn eine Funktion aufgerufen wird, wird eine lokale Kopie der Argumente erstellt und innerhalb der Funktion verwendet. Wenn Sie die Werte von a oder b innerhalb der Funktion ändern (was durchaus gültig ist), wirkt sich dies nur auf den Wert von a und b innerhalb dieser Funktion aus. Die Werte, die die Argumente in der Funktion hatten, von der aus sie aufgerufen wurden, werden nicht geändert.

  return res;

Schließlich müssen wir das Ergebnis zurückgeben. Die Funktion wurde so definiert, dass sie eine Ganzzahl zurückgibt. Daher muss sie die return-Anweisung mit einem Ganzzahlwert aufrufen, um an die aufrufende Funktion zurückgegeben zu werden.

Eine Funktion muss keinen Wert zurückgeben. Wenn der Rückgabetyp auf void gesetzt ist, wird nichts zurückgegeben. In einer Funktion mit einem ungültigen Rückgabetyp ist keine return-Anweisung erforderlich. Die Funktion kehrt zurück, wenn die letzte Zeile erreicht ist. Wenn Sie jedoch vorzeitig zurückkehren möchten (z. B. im Fehlerfall), rufen Sie einfach return ohne Wert danach auf.

[RÜCKGABEWERTE]
Eine Funktion kann einen einzelnen, oder gar keinen Wert zurückgeben. Wenn Sie die Funktion als Rückgabe ungültig definieren, müssen Sie keine return-Anweisung verwenden. Sie erhalten jedoch eine Fehlermeldung, wenn Sie keine Rückgabe des richtigen Typs in eine nicht ungültige Funktion aufnehmen.

Eine Funktion aufrufen

Schauen wir uns an, wie wir die Funktion von main aus aufrufen:

  int z = sum (5, y);
$ ./myprog
Die Summe von 5 und 2 ist 7
$

Oben: Die Main Funktion gibt die Werte aus, welche von der sum-Funktion zurückgegeben werden.

Die sum-Funktion gibt eine Ganzzahl zurück, daher setzen wir eine Ganzzahlvariable gleich dieser. Die Argumente, die wir für die Funktion angeben, befinden sich in runden Klammern und in derselben Reihenfolge wie in der Funktionsdefinition. In diesem Fall ist a also 5 und b der Wert von y.

Können Sie mehr als ein Ergebnis einer Funktion zurückgeben? Sie können nur einen Wert zurückgeben, aber Sie können auch Pointer verwenden, um mehrere Datenelemente an die aufrufende Funktion zurückzugeben. Betrachten Sie dieses Beispiel:

#include <stdio.h>
 
int sum_and_diff (int a, int b, int *res)
{
  int sum;
  sum = a + b;
  *res = a – b;
  return sum;
}
 
void main (void)
{
  int b = 2;
  int diff;
 
  printf ("Die Summe von 5 und %d ist %d\n", b,
    sum_and_diff (5, b, &diff));
  printf ("Die Differenz von 5 und %d ist %d\n", b, diff);
}
Sie können einen Funktionsaufruf überall dort verwenden, wo eine Variable des gleichen Typs wie der von der Funktion zurückgegebene Wert verwendet werden kann. Im Code hier ersetzt ein Aufruf von sum_and_diff einen ganzzahligen Wert in den Argumenten für printf.

Wir haben die sum-Funktion geändert, um sowohl die Summe als auch die Differenz der Argumente zu berechnen. Die Summe wird wie zuvor zurückgegeben, aber wir geben die Differenz auch mit Hilfe eines Pointers zurück. Denken Sie daran, dass die Argumente für eine Funktion lokale Variablen sind. Selbst wenn Sie eine in der Funktion ändern, hat dies keine Auswirkung auf den von der aufrufenden Funktion übergebenen Wert. Aus diesem Grund sind Pointer nützlich. Durch Übergeben eines Pointers ändert die Funktion nicht den Wert des Pointers selbst, sondern kann den Wert in der Variablen ändern, auf die er zeigt.

[ARGUMENTE ÄNDERN]
Argumente sind lokale Variablen innerhalb einer Funktion. Wenn eine Funktion die von Ihnen angegebenen Argumente ändern soll, erstellen Sie für jedes Argument, das Sie ändern möchten, einen Pointer auf eine Variable. Sie können dann den Wert lesen, auf den in der Funktion verwiesen wird, und den geänderten Wert in denselben Pointer zurückschreiben.

Wir rufen die Funktion also mit den selben zwei Argumenten wie zuvor auf, fügen jedoch ein drittes hinzu, einen Pointer auf die Variable, in die wir die von der Funktion berechnete Differenz schreiben möchten. In der Funktion haben wir diese Zeile:

  *res = a – b;

Die Differenz wird in die Variable geschrieben, auf die res ein Pointer ist. In der Hauptfunktion rufen wir die Funktion sum_and_diff folgendermaßen auf:

  sum_and_diff (5, b, &diff)

Wir geben als Pointer Argument die Adresse des Integers diff zur Funktion sum_and_diff an. Wenn die Differenz berechnet wird, wird sie in die Variable diff in der Hauptfunktion geschrieben.

$ ./myprog
Die Summe von 5 und 2 ist 7
Die Differenz von 5 und 2 ist 3
$

Oben: Wenn Sie einen Pointer als ein Argument verwenden, kann die Funktion sum_and_diff sowohl die Summe als auch die Differenz der Argumente zurückgeben.

Ordnung ist wichtig

Beachten Sie beim Definieren von Funktionen, dass der Compiler Dateien von oben nach unten liest und Sie sie über eine Funktion informieren müssen, bevor Sie sie verwenden können. In den obigen Beispielen erfolgt dies automatisch, da die Definition der Funktionen sum und sum_and_diff vor dem ersten Aufruf von main erfolgt.

In größeren Dateien wird es jedoch kompliziert, wenn mehrere Funktionen mehrere andere Funktionen aufrufen. Es ist nicht immer einfach sicherzustellen, dass die Funktionsdefinitionen alle in der richtigen Reihenfolge erfolgen. Um dies zu vermeiden, können Sie mit C Funktionen deklarieren, bevor sie verwendet werden.

Eine Funktionsdeklaration ist nur die Definition der Funktion, abzüglich des Funktionscodes in den geschweiften Klammern. Für die Funktion sum_and_diff wäre die Deklaration also:

  int sum_and_diff (int a, int b, int *res);

Beachten Sie das Semikolon am Ende! Funktionsdeklarationen sind am Anfang der Datei enthalten. Wenn der Compiler eine Funktionsdeklaration findet, weiß er, dass irgendwann eine Funktion mit diesem Namen, Argumenten und Rückgabetyp definiert wird, sodass er weiß, wie ein Aufruf zu verarbeiten ist, auch wenn er die Definition selbst noch nicht gesehen hat.


Zurück zum Inhalt    Vorige Seite    Nächste Seite

capt06.txt · Zuletzt geändert: 2020/10/29 10:42 von administrator