Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 11 Funktionen
  gp 11.1 Was sind Funktionen?
  gp 11.2 Wozu Funktionen?
  gp 11.3 Definition von Funktionen
  gp 11.4 Funktionsaufruf
  gp 11.5 Funktionsdeklaration
  gp 11.6 Lokale Variablen
  gp 11.7 Globale Variablen
  gp 11.8 Statische Variablen
  gp 11.9 Schlüsselworte für Variablen – Speicherklassen
    gp 11.9.1 auto
    gp 11.9.2 extern
    gp 11.9.3 register
    gp 11.9.4 static
  gp 11.10 Typ-Qualifizierer
    gp 11.10.1 volatile
    gp 11.10.2 const
  gp 11.11 Geltungsbereich von Variablen
  gp 11.12 Speicherklassen-Spezifizierer für Funktionen
    gp 11.12.1 extern
    gp 11.12.2 static
    gp 11.12.3 volatile
  gp 11.13 Datenaustausch zwischen Funktionen
  gp 11.14 Wertübergabe an Funktionen (call-by-value)
  gp 11.15 Rückgabewert von Funktionen
  gp 11.16 Die Hauptfunktion main()
  gp 11.17 Rückgabewert beim Beenden eines Programms
  gp 11.18 Funktionen der Laufzeitbibliothek
  gp 11.19 Getrenntes Compilieren von Quelldateien
  gp 11.20 Rekursive Funktionen
    gp 11.20.1 Exkurs: Stack
    gp 11.20.2 Rekursionen und der Stack
    gp 11.20.3 Fakultät
    gp 11.20.4 Fibonacci-Zahlen
    gp 11.20.5 Größter gemeinsamer Teiler (GGT)


Galileo Computing - Zum Seitenanfang

11.14 Wertübergabe an Funktionen (call-by-value)  toptop

Es folgt ein Beispiel, wie Sie einer Funktion Daten übergeben können:

/* func9.c */
#include <stdio.h>
void verdoppeln(int);
void halbieren(int);
void halbieren(int zahl) {
   zahl /= 2;
   printf("Halbiert : %d\n", zahl);
}
void verdoppeln(int zahl) {
   zahl *= 2;
   printf("Verdoppelt : %d\n", zahl);
}
int main(void) {
   int wahl, z;
   printf("Bitte geben Sie eine Zahl ein : ");
   scanf("%d",&z);
   printf("Wollen Sie diese Zahl\n");
   printf("\t1.)verdoppeln\n\t2.)halbieren\n\nIhre Wahl : ");
   scanf("%d",&wahl);
   switch(wahl) {
      case 1  : verdoppeln(z);
                break;
      case 2  : halbieren(z);
                break;
      default : printf("Unbekannte Eingabe\n");
    }
   return 0;
}

An der Deklaration der Funktion können Sie schon erkennen, dass die Funktion einen Parameter vom Datentyp int verwendet. Außerdem fällt auf, dass die globale Variable verschwunden ist und in der main()-Funktion wieder auftaucht. Ein Blick auf eine Funktion:

void halbieren(int zahl) {
   zahl /= 2;
   printf("Halbiert : %d\n",zahl);
}

Es handelt sich also um eine Funktion, die als Parameter einen int-Wert übernimmt. Das bedeutet, dass Sie die Funktion halbieren() nur mit einem Argument vom Typ int aufrufen können. Andernfalls meldet der Compiler einen Fehler.

Aufgerufen wird diese Funktion (von einer anderen Funktion aus) mit einem Argument, auch formaler Parameter genannt. Im gezeigten Beispiel sieht der Funktionsaufruf mit Argument folgendermaßen aus:

halbieren(zahl);

Dann wird für die aufrufende Funktion ein Stack-Rahmen (dynamischer Speicherbereich) angelegt. In diesem Speicherbereich wird Speicher für diejenigen Parameter reserviert, welche die Funktion beinhaltet. Der Parameter, den Sie der Funktion durch das Argument übergeben haben, wird auch initialisiert. Damit steht der Funktion das Argument z auch mit dem gleichen Wert für die Funktion halbieren(), nur mit dem Namen zahl, als Kopie zur Verfügung. Die Funktion kann nun mit den Parametern ganz normal arbeiten. Der Parameter einer Funktion ist bei einer so genannten Call-by-value-Übergabe eine Kopie des Werts, mit dessen Argument Sie die Funktion aufgerufen haben.

Nochmals die vier Schritte, wie der Datenfluss bei Übergabe von Argumenten abläuft:

1. Bei der Funktionsdefinition wird die Parameterliste festgelegt (formale Parameterliste).
       
2. Die Funktion wird von einer anderen Funktion mit dem Argument aufgerufen (muss mit dem Typ des formalen Parameters übereinstimmen).
       
3. Für die Funktion wird ein dynamischer Speicherbereich (im Stack) angelegt.
       
4. Jetzt kann die Funktion mit den Parametern arbeiten.
       

Neben call-by-value existiert auch call-by-reference, womit statt einem Wert eine Adresse kopiert wird. Diese Art des Aufrufs wird im Zusammenhang mit Zeigern näher besprochen (Kapitel 14).

Natürlich können Sie auch mehrere Parameter in einer Funktion verwenden. Als Anwendungsbeispiel soll im Folgenden der gregorianische Kalender zum julianischen umgerechnet werden. Dieses Verfahren wird vorwiegend in der Astronomie und Raumfahrt genutzt.

Der julianische Kalender beginnt mit der ägyptischen Berechnung seit dem 1.1.4713 vor Christus. Mit dem julianischen Datum lässt sich sehr gut die Sonnen- bzw. Mondfinsternis berechnen:

/* greg2jul.c */
#include <stdio.h>
/* Umrechnung vom gregorianischen zum julianischen Datum */
void greg2jul(int tag, int monat, int jahr) {
   int k, l, jd;
   k = (monat – 14) / 12;
   l = jahr + k + 4800;
   jd = tag – 32075 + 1461 *l / 4 + 367 *
      ((monat-2–12*k) / 12) – 3 * ((l+100) / 100) / 4;
   printf(" sind %d Tage vergangen\n",jd);
}
int main(void) {
   int tag,monat,jahr;
   printf("Eingabe (Tag)  : ");
   scanf("%d",&tag);
   printf("Eingabe (Monat): ");
   scanf("%d",&monat);
   printf("Eingabe (Jahr) : ");
   scanf("%d",&jahr);
   printf("Seit dem 1.1.4713 v.Chr. bis %2d.%2d.%4d",
      tag,monat,jahr);
   greg2jul(tag, monat, jahr);
   return 0;
}

Wichtig ist dabei, dass Sie darauf achten, die Argumente beim Funktionsaufruf in der richtigen Reihenfolge anzugeben. Vertauschte Werte führen zu falschen Berechnungen. Die Parameter könnten auch von unterschiedlichen Datentypen sein, was der Compiler im Fall der Vertauschung in den meisten Fällen aber moniert:

/* func10.c */
#include <stdio.h>
void mixed(int x, char y, float z) {
   printf("Stückzahl : %d ",x);
   printf("Klasse    : %c ",y);
   printf("Preis     : %.2f Euro\n",z);
}
int main(void) {
   mixed(6, 'A', 5.5f);
   mixed(9, 'B', 4.3f);
   return 0;
}
 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de