Parameter und Argumente
Die Funktionen, die du bisher geschrieben hast, tun jedes Mal genau dasselbe. zeige_banner gibt immer dieselben drei Zeilen aus. Oft soll eine Funktion aber fast dasselbe tun, nur jedes Mal ein bisschen anders: eine Linie aus 5 Strichen ausgeben und dann eine aus 20. Solche Werte bekommt eine Funktion durch Parameter:
#include <stdio.h>
void zeige_linie(int laenge) {
for (int i = 0; i < laenge; i++) {
printf("-");
}
printf("\n");
}
int main(void) {
zeige_linie(5);
zeige_linie(20);
return 0;
}Dieses Programm gibt aus:
-----
--------------------In der Definition ist int laenge in den Klammern ein Parameter: eine Variable, die die Funktion in ihrem Rumpf verwenden kann. Wie jede Variable hat er einen Datentyp und einen Namen, nur ohne Semikolon. Er steht an der Stelle des Worts void, das bedeutete, dass die Funktion nichts entgegennimmt. Im Aufruf ist der Wert in den Klammern, 5, ein Argument. Wenn du die Funktion aufrufst, wird das Argument im Parameter gespeichert, und dann läuft der Rumpf. Beim ersten Aufruf ist laenge gleich 5, beim zweiten gleich 20.
Diese beiden Wörter verwechselt man leicht, also merke dir: Ein Parameter ist eine Variable in der Definition, ein Argument ist ein Wert im Aufruf. Ein Argument kann eine Zahl sein, eine Variable oder ein ganzer Ausdruck, etwa zeige_linie(breite * 2). Und jetzt weißt du auch, was "Hallo!\n" in printf("Hallo!\n") ist: ein Argument der Funktion printf.
Eine Funktion kann mehrere Parameter haben, durch Kommas getrennt. Jeder Parameter hat seinen eigenen Datentyp, auch wenn die Typen gleich sind: int heim, int gast, nicht int heim, gast. Die Argumente gehen der Reihe nach in die Parameter: das erste Argument in den ersten Parameter, das zweite in den zweiten und so weiter:
#include <stdio.h>
void zeige_ergebnis(int heim, int gast) {
printf("Ergebnis: %d:%d\n", heim, gast);
}
int main(void) {
zeige_ergebnis(2, 1);
zeige_ergebnis(0, 3);
return 0;
}Dieses Programm gibt aus:
Ergebnis: 2:1
Ergebnis: 0:3C prüft, ob die Argumente zu den Parametern passen. Jeder Parameter braucht sein Argument. Wenn du im ersten Aufruf nur zeige_ergebnis(2); schreibst, lässt sich das Programm nicht kompilieren:
main.c:8:21: error: too few arguments to function call, expected 2, have 1
8 | zeige_ergebnis(2);
| ~~~~~~~~~~~~~~ ^
main.c:3:6: note: 'zeige_ergebnis' declared here
3 | void zeige_ergebnis(int heim, int gast) {
| ^ ~~~~~~~~~~~~~~~~~~
1 error generated.Die erste Zeile sagt, dass der Aufruf zu wenige Argumente hat: Die Funktion erwartet 2, aber der Aufruf hat 1. Die note darunter zeigt, wo die Funktion definiert ist. Bei zu vielen Argumenten heißt die Meldung too many arguments to function call.
Auch der Typ jedes Arguments sollte zu seinem Parameter passen. Text, wo eine Zahl hingehört, etwa zeige_ergebnis("zwei", 1), lässt sich nicht kompilieren. Aber eine Dezimalzahl für einen int-Parameter wird stillschweigend auf eine Ganzzahl abgeschnitten: zeige_ergebnis(2.7, 1) gibt Ergebnis: 2:1 aus. Und wenn du zwei Argumente desselben Typs vertauschst, kann der Compiler es gar nicht bemerken: zeige_ergebnis(1, 2) gibt einfach ein anderes Ergebnis aus. Prüfe also immer die Reihenfolge deiner Argumente.
Jetzt siehst du auch, warum wir bei einer Funktion ohne Parameter (void) schreiben. Bei void begruesse(void) ist der Aufruf begruesse(5) ein Fehler: too many arguments to function call, expected 0, have 1. Bei leeren Klammern, void begruesse(), würde C den Aufruf durchlassen. Leere Klammern siehst du in Programmen anderer Leute, aber (void) ist sicherer.
So schreibst du es:
Anweisungen
- 1
Schreibe über
maineine Funktionzeige_reihemit zwei Parametern:zeichenvom Typcharundanzahlvom Typint. Sie gibt nichts zurück. Sie gibtzeichenso oft aus, wieanzahlangibt, alles in einer Zeile: Gib in einerfor-Schleife nur das Zeichen aus (mit%c) und beende die Zeile nach der Schleife. - 2
Rufe in
mainzeige_reihe('*', 5)und dannzeige_reihe('#', 3)auf. Das Programm gibt*****und###aus. - 3
Ein Argument kann auch eine Variable sein. Schreibe unter die beiden Aufrufe eine
for-Schleife, in derivon1bis4geht und diezeige_reihe('*', i)aufruft. In jedem Durchlauf der Schleife bekommt die Funktion ein anderes Argument, sodass das Programm ein Dreieck zeichnet:* ** *** ****