Programmieren
 
 
 
 
 
C-Grundkurs

 
 
 
 
.. Definition einer eigenen funktion()
 
 

 
 
 
 

 

Bisher war nur von Funktionen der statischen Bibliothek die Rede. Deren Definitionen (Programmcodes.obj) befinden sich in der Bibliothek, ihre Deklarationen (Funktionsköpfe zur Fehlerkontrolle) sind in den Header-Dateien.h aufgehoben. Am Beispiel der Funktion volumen( ) soll gezeigt werden, wie eine benutzereigene Funktion deklariert und definiert und aufgerufen wird.

Die Funktion erhält drei doppeltgenaue Fliesskommazahlen übergeben, multipliziert diese miteinander und gibt das Ergebnis als doppeltgenaue Fliesskommazahl zurück. Die Funktion soll von main() aus aufgerufen, und das Ergebnis durch printf() zum Bildschirm ausgegeben werden.

 

 

 

 

#include <stdio.h>                            // für printf() 

double volumen(double, double, double);       // Deklaration
void main (void)
{
 double a= 2.5, b= 5.38, c= 12.362;
 double erg;

 erg = volumen(a, b, c);                      // Aufruf
 printf ("Volumen = %f", erg);
}
double volumen(double l, double b, double h)  // Definition
{
 double e;
 e = l * b * h;
 return(e);
}

 

 

 


Beschreibung der Definition von volumen()
Die Funktion volumen() erhält drei Fliesskommazahlen über den Stack, den man sich als Zwischenspeicher vorstellen kann, übergeben und weist diese den Variablen l-für Länge, b-für Breite und h-für Höhe zu.
Sie soll das Ergebnis in Form einer doppeltgenauen Fliesskommazahl, also in 8 Bytes zurückgeben. Damit dies geschieht, ist der Befehl return() notwendig. In den Klammern von return, steht die Variable e, die das zuvor errechnete Ergebnis der Variablen a•b•c enthält. Deren Wert wird durch den return()-Befehl in die Prozessorregister der CPU geladen, dann wird die Funktion beendet. Mit dieser Funktion lässt sich also das Volumen eines rechteckigen Körper berechnen.

Wie gesagt erhält die Funktion volumen() von main() drei Fliesskommazahlen übergeben und weist sie den Variablen l, b und h zu. Da die Zahlen vom aufrufenden Programm auf den Stack gelegt wurden, enthält l den Wert der Variablen a des main()-Programms, der ist 2.5 und b entsprechend den von b, also 5.3 sowie h den von c, mit dem Wert 12.362. Wegen des geschilderten Übergabemechanismus würden die Variablen a, b, c der main()-Funktion auch dann unverändert bleiben, wenn in der Funktion volumen() die Variablen l, b, h verändert würden. l,b,h stellen nur Kopien der Werte des aufrufenden Programms dar, auch dann, wenn wie bei b, die Variablen gleiche Namen tragen. Man sagt die Variablen der Funktion seien lokal.

Beschreibung der Deklaration von volumen()
Die Deklarationszeile im Kopf des Programms ist notwendig, da die Funktion erst definiert wird, nachdem ihr Aufruf im main()-Programm erfolgte. Der Compiler hätte ohne die Deklarationszeile keine Möglichkeit gehabt, die Richtigkeit des Aufrufs zu überprüfen um eine eventuelle Fehlermeldung abzugeben. Er kennt ja die Eigenschaften von volumen() zu diesem Zeitpunkt noch nicht. Die angegebene Deklarationszeile ist die Mindestversion. Eigendlicht braucht der Compiler zur Überprüfung nur die Angaben, wieviele Variablen übergeben werden sollen und von welchem Typ die Rückgabe- und die Übergabevariablen sind. Diese Angaben wurden gemacht.

Allerdings hätten in der Deklaration auch noch Variablennamen genannt werden können. Diese wären jedoch nur für den Programmierer von Interesse, da er später über aussagekräftige Variablennamen in der Deklarationszeile seine Erinnerung auffrischen kann.

Beispiel:

double volumen( double lang, double breit, double hoch);

Die Variablennamen der Deklaration haben also weder etwa mit den Namen des Aufrufs noch mit den Namen der Definition zu tun. Alle drei Orte an denen die Namen auftreten sind unabhängig voneinander. In der Deklarationszeile sollten sie aussagekräftig sein, bei der Definition sollten sie kurz sein, ebenso in der Funktion, welche einen Aufruf vornimmt.

Beschreibung von main()
In main() wird die Funktion durch erg=volumen(a,b,c); aufgerufen. Ihr werden die zuvor deklarierten, definierten und initialisierten Variablen a und b übergeben. Dies geschieht durch eine Kopie der Inhalte von a, b und c auf den Stack. Dadurch sind die Variablen a, b und c vor gleichlautenden Variablen in anderen Funktionen geschützt. Sie haben nichts mit denen gemein. Nachdem volumen() ausgeführt wurde, kehrt die Programmausführung nach main() zurück und in den Prozessorregistern der CPU steht das Ergebnis der Volumenberechnung. Dieses sollte (muss aber nicht) in eine Variable, hier erg, von main() übertragen werden, was ja geschieht. Der Inhalt der Ergebnisvariablen erg wird durch die Bibliotheksfunktion printf() auf den Bildschirm ausgegeben, auf dem die Ausgabe erscheint ..

Volumen = 166.2689

Schlusszustand:
Im Hauptprogramm main() besitzen die Variablen a, b und c noch immer ihre alten Werte, zudem wurde die Variable erg mit dem Ergebnis gefüllt. Nach dem Rücksprung von volumen() zum Hauptprogramm main() wurde der Stack gelöscht und damit die Variablen l, b und h. Ebenso erging es der dort neu eingerichtete Variable e. Wäre das Ergebnis von volumen() nicht nach erg übernommen worden, wäre es jetzt verloren.












Anmerkung:
Wegen des beschriebenen Über- und Rückgabemechanismus zwischen zwei Funktionen dürfen in der Deklaration, beim Aufruf und der Definition die gleichen Variablennamen benutzt werden. Man sagt die Variablen seinen lokal wirksam. Variablen in der einen Funktion besitzen keine Verbindung zu gleichlautenden Variablen innerhalb einer anderen Funktion. Probieren Sie das mal durch ein entsprechendes Testprogramm aus.





www..de