Programmiersprache C/C++

7.x. Unterprogramme

Unterprogramme sind Programmeinheiten, d.h. Bausteine, mit deren Hilfe die Konstruktion eines Programms vereinfacht werden kann.

Zu betrachten sind

In vielen Programmiersprachen gibt es eine syntaktische Unterscheidung zwischen In C und C++ wird das Hauptprogramm in der gleichen Weise deklariert wie Unterprogramme, lediglich der Name main entscheidet darüber, das es sich bei der so benannten Programmeinheit um das Hauptprogramm handelt.
Das Hauptprogramm kann in C wie jedes andere Unterprogramm sogar rekursiv aufgerufen werden.

Die meisten Sprachen unterscheiden verschiedene Arten von Unterprogrammen:

Mitunter kommt eine dritte Art hinzu: C nimmt keine deutliche Trennung in Prozeduren und Funktionen vor.
Alle Unterprogramme (und das Hauptprogramm) sind als Funktionen realisiert.
Funktionen mit dem Datentyp void werden aufgerufen wie Prozeduren.
Funktionen mit einem "richtigen" Datentyp können wahlweise wie Funktionen oder wie Prozeduren aufgerufen werden.

Die Möglichkeit, neue Operatoren zu definieren bzw. vorhandene zu überladen, gibt es z.B. in Ada und in Pascal-XSC.

Prozeduren, Funktionen und Operatoren können innerhalb gewisser Grenzen alternativ eingesetzt werden.
Beispiel: Addition zweier ganzer Zahlen

mittels Operator

  int x, y, z;

  z = x + y;
mittels Funktion
  int add(int x, int y)
  {
    return x + y;
  }

  int x, y, z;
    
  z = add(x, y);
mittels "Prozedur"
  void add(int x, int y, int *z);
  {
    *z = x + y;
  }
    
  int x, y, z;

  add(x, y, &z);
Im Vergleich zeigt sich folgendes: Operatoren werden typischerweise in den Sprachdefinitionen festgelegt.
Funktionen und Prozeduren werden durch Sprachstandards nicht immer bzw. oft nur für sehr elementare Aufgaben definiert. (Ausnahmen sind C bzw. C++ und Ada). Sprachrealisierungen fügen oft weitere Funktionen und Prozeduren hinzu, die sich aber häufig voneinander unterscheiden (Beispiele dafür sind Pascal und Modula, nichtportable Erweiterungen gibt es aber auch in C-Systemen).

Datenaustausch mit Unterprogrammen

Für den Datenaustausch mit Unterprogrammen gibt es folgende prinzipielle Möglichkeiten:

Der Datenaustausch über Dateien bietet die größte Flexibilität, ist jedoch mit gegebenfalls erheblich höherer Laufzeit und dem Problem verbunden, daß 'Dritte' Zugriff zu den Daten erhalten können.

Die Arbeit mit globale und gemeinschaftlichen Daten ist für den Programmierer die - scheinbar - unaufwendigste Form für den Datenaustausch innerhalb eines Programms:

Programmeinheiten, die diese Formen des Datenaustausches nutzen, sind nicht bzw. nur eingeschränkt nachnutzbar.

Gemeinschaftliche Daten sind in speziellen Bereichen (COMMON-Blöcken) angeordnet, auf die jede Programmeinheit bei Bedarf Bezug nehmen kann. Im Gegensatz zu Dateien werden diese Daten permanent im Hauptspeicher gehalten.
COMMON-Blöcke sind in C nicht üblich.

Globale Daten werden automatisch an alle Unterprogramme weitergegeben, die der Deklaration dieser Daten folgen und die im gleichen Programmblock angesiedelt sind.
Die Arbeit mit globalen Daten wird durch C unterstützt.

Parameter werden an ein Unterprogramm über eine definierte Schnittstelle - die Parameterliste - übergeben.
Diese Schnittstelle legt fest, welche Daten (Anzahl, Datentyp) in welcher Richtung (lesen, schreiben) ausgetauscht werden.
Die Organisation der Datenübergabe und Art und Umfang der dabei wirksamen Kontrolle sind in den einzelnen Programmiersprach(version)en unterschiedlich ausgebaut.
C stellt eine gewisse Kontrolle bereit, es gibt jedoch Möglichkeiten, diese Kontrolle zu umgehen.

Der Datenaustausch mit Parametern ist aufwendiger zu programmieren, bietet aber folgende Vorteile:

Die Arbeit mit Parameterlisten ist die sicherste Form des Datenaustausches. Sie kann entweder ausschließlich oder in Kombination mit anderen Techniken genutzt werden.

Funktionen müssen in C eine - gegebenenfalls leere - Parameterliste besitzen.

Die an das Unterprogramm bei einem Aufruf zu übergebenden Daten werden als aktuelle Parameter bezeichnet.
Als aktuelle Parameter können

notiert werden.
Bei bestimmten Techniken der Parameterübergabe sind Variablen vorgeschrieben.
Ausdrücke werden vor der Übergabe ausgewertet.

Die in der Deklaration eines Unterprogramms notierten Parameter werden in Unterscheidung von den aktuellen Parametern auch als formale Parameter bezeichnet.

Es gibt verschiedene Techniken der Parameterübergabe an ein Unterprogramm. Dabei werden vor allem zwei Techniken eingesetzt:

Referenzparameter (call by reference):
Das Unterprogramm erhält die Adresse des aktuellen Parameters.
Entweder darf es in dem Speicherbereich, den der aktuelle Parameter belegt Bei der zweiten Variante muß der aktuelle Parameter stets eine Variable sein.
Das Unterprogramm arbeitet im Speicherbereich der aufrufenden Programmeinheit.

Wertparameter (call by copy):
Das Unterprogramm arbeitet mit einer Kopie, es arbeitet nicht im Speicherbereich der aufrufenden Programmeinheit.
Es gibt folgende Varianten:
C arbeitet standardmäßig mit einem "call by value" !
Für Unterprogramme, die über Parameter Daten an die aufrufende Programmeinheit zurückliefern sollen, erfordert das spezielle Maßnahmen: Diese Arbeitsweise birgt gewisse Risiken in sich:
Das Unterprogramm kann nicht entscheiden, ob ihm wirklich eine Adresse und versehentlich ein "richtiger" Wert übergeben wurde.

Delphi und XL Pascal (VM-Modus) gestatten eine dritte Form der Parameterübergabe: Mit welchen der oben beschriebenen Techniken der Parameterübergabe diese Formen realisiert werden, kann von Pascal-System zu Pascal-System variieren.
Es sollte in der Regel so programmiert werden, daß keine Abhängigkeiten von der verwendeten Technik entstehen.
Beispiel: Als Eingangsgrößen deklarierte Parameter sollten im Unterprogramm nie einen neuen Wert erhalten.

Die Technik der Parameterübergabe kann jedoch Einfluß auf das Laufzeitverhalten und den Speicherbedarf des Programms haben. Ferner besteht ein gewisser Einfluß die mögliche Höhe von Schäden durch fehlerhaften Programmcode.
Folgende Faktoren spielen dabei unter anderem eine Rolle:

Gestaltungsregeln

Für den Aufbau von Unterprogrammen gibt es einige Gestaltungsregeln:


Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 12.02.1996