Unterfunktionen in C?

1 Antwort

Du meinst vermutlich einfach nur Funktionen.

void doSomething() {
  // do something ...
}

Im Grunde sind dies benannte Code-Blöcke, die über ihren Namen an verschiedenen Code-Stellen aufgerufen werden können.

Angenommen, du möchtest mehrere Zahlenpaare jeweils miteinander addieren und folgend das Ergebnis ausgeben. Dann könntest du dies im Code so schreiben:

int summand1 = 2;
int summand2 = 3;
int sum1 = summand1 + summand2;
printf("%i", sum1);

int summand3 = 1;
int summand4 = 7;
int sum2 = summand3 + summand4;
printf("%i", sum2);

// usw. ...

Negative Aspekte hierbei:

  • es ist aufwendig
  • erzeugt ellenlangen Code
  • es macht dein Programm schlechter lesbar und wartbar (angenommen, du möchtest z.B. bei jeder Ausgabe noch "Ergebnis:" davor stehen haben)
  • es ist fehleranfällig (mehr Schreiben = mehr mögliche Tippfehler)

Daher ist es sinnvoll, den Code zu abstrahieren und in einen Code-Block auszulagern.

void printSum(int summand1, int summand2) {
  int sum = summand1 + summand2;
  printf("%i", sum);
}

Der lässt sich nun mehrmals aufrufen:

printSum(2, 3);
printSum(1, 7);
// etc. ...

Diese Code-Blöcke können Werte von außen aufnehmen (über Parameter) oder / und Werte wieder zurückgeben. Ein Beispiel mit Parametern habe ich schon aufgezeigt. Dies sind lokale Variablen, die innerhalb der Parameterliste (runde Klammern) deklariert werden. Bei Aufruf werden ihnen Argumente übergeben. Reihenfolge und Datentyp sind wichtig.

Beispiel:

void add(int a, int b) {
  int sum = a + b;
}

// main:
add(2, 1); // a = 2, b = 1
add("2", 1); // wrong, String is not an int
add(3); // wrong, one argument for b is missing

Eine Funktion kann theoretisch beliebig viele Parameter definieren. Bei Aufruf müssen diese nur alle passend bedient werden. Jeder Parameter kann einen eigenen Datentyp haben:

void doSomething(char someLetter, int someNumber, float someFloatNumber) { // ...

Nun zu den Rückgabetypen: Wie du siehst, macht die add-Funktion oben noch nicht viel Sinn. Sie berechnet zwar eine Summe, doch mit der wird nicht mehr viel gemacht. Wenn der Programmfluss durch die Funktion gelaufen ist, sind die lokalen Variablen (sum, a, b) wieder weg.

Besser wäre es doch, das berechnete Ergebnis nach außen zu überreichen, damit dort mit dem Wert weiter gearbeitet werden kann.

int add(int a, int b) {
  int sum = a + b;
  return sum;
}

// main:
int sum = add(4, 3);

Zuerst wird im Methodenkopf ein Rückgabetyp definiert. Zuvor stand dort void, was andeutet, dass die Funktion nichts zurückgibt. Wenn ein Rückgabetyp definiert wurde, muss die Funktion einen passenden Wert liefern. Dies lässt sich via return-Befehl realisieren. Die Variable sum fängt in meinem Beispiel den Rückgabewert auf.

Der Befehl return kann nicht nur einen Wert zurückgeben - er bricht auch die Funktion an dem Punkt ab, zu dem er aufgerufen wird.

Sinnbefreites Beispiel:

int add(int a, int b) {
  if (a == 1) {
    return 2;
  }

  int sum = a + b;
  return sum;
}

Wenn das erste Argument einer 1 entspricht, gibt die Funktion den Wert 2 zurück. Die letzten beiden Zeilen werden nicht mehr beachtet.

Zuletzt noch eine best practice für Funktionen: Jede Funktion sollte nur eine Aufgabe erfüllen und dies im Namen auch klar (durch ein Verb) bezeichnen.

Beispiel:

//-- good
int add(int summand1, int summand2) {
  return summand1 + summand2;
}

//-- bad
int add(int summand1, int summand2) {
  int sum = summand1 + summand2;
  printf("%i", sum); // doing more than defined!
  
  return sum;
}
Oder kennt ihr gute deutschsprachige Videos der Webs(ausser C How to)?

Ich kenne keine unbedingt empfehlbaren Tutorials. Selbst die englische Dokumentation von Microsoft erscheint nicht gerade ausführlich.

Ich würde eher zu einem Buch raten, wie dem von Erlenkötter: C: Programmieren von Anfang an.


redis999 
Fragesteller
 20.02.2019, 19:29

Perfekte Erklaerung! Danke

0