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

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1411-7
Pfeil 9 Funktionen
Pfeil 9.1 Was sind Funktionen?
Pfeil 9.2 Wozu dienen Funktionen?
Pfeil 9.3 Definition von Funktionen
Pfeil 9.4 Funktionsaufruf
Pfeil 9.5 Funktionsdeklaration
Pfeil 9.6 Lokale Variablen
Pfeil 9.7 Globale Variablen
Pfeil 9.8 Statische Variablen
Pfeil 9.9 Schlüsselwörter für Variablen – Speicherklassen
Pfeil 9.9.1 auto
Pfeil 9.9.2 extern
Pfeil 9.9.3 register
Pfeil 9.9.4 static
Pfeil 9.10 Typ-Qualifizierer
Pfeil 9.10.1 volatile
Pfeil 9.10.2 const
Pfeil 9.11 Geltungsbereich von Variablen
Pfeil 9.12 Speicherklassen-Spezifizierer für Funktionen
Pfeil 9.12.1 extern
Pfeil 9.12.2 static
Pfeil 9.12.3 volatile
Pfeil 9.13 Datenaustausch zwischen Funktionen
Pfeil 9.14 Wertübergabe an Funktionen (call-by-value)
Pfeil 9.15 Der Rückgabewert von Funktionen
Pfeil 9.16 Die Hauptfunktion »main()«
Pfeil 9.17 Rückgabewert beim Beenden eines Programms
Pfeil 9.17.1 Programmende auswerten
Pfeil 9.18 Funktionen der Laufzeitbibliothek
Pfeil 9.19 Getrenntes Kompilieren von Quelldateien
Pfeil 9.20 Rekursive Funktionen (Rekursion)
Pfeil 9.20.1 Exkurs: Stack
Pfeil 9.20.2 Rekursionen und der Stack
Pfeil 9.20.3 Fakultät
Pfeil 9.20.4 Fibonacci-Zahlen
Pfeil 9.20.5 Größter gemeinsamer Teiler (GGT)
Pfeil 9.21 »inline«-Funktionen


Rheinwerk Computing - Zum Seitenanfang

9.14 Wertübergabe an Funktionen (call-by-value) topZur vorigen Überschrift

Hier folgt ein Beispiel, das zeigt, 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. Werfen Sie einmal einen 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, die 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 sogenannten Call-by-value-Übergabe eine Kopie des Werts, mit dessen Argument Sie die Funktion aufgerufen haben.

Fassen wir die vier Schritte zusammen, wie der Datenfluss bei der Ü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 (sie 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 12).

Natürlich können Sie auch mehrere Parameter in einer Funktion verwenden. Als Anwendungsbeispiel soll im Folgenden der gregorianische Kalender in den 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 lassen sich sehr gut Sonnen- bzw. Mondfinsternisse 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;
}


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: C/C++






 C/C++


Zum Katalog: Einstieg in C






 Einstieg in C


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
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.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de