Axel Rogat
Objektorientiertes Programmieren mit C++ und JAVA
 
7.9: Pointer auf Funktionen Kapitel 7 8.1: Speicherarten 
 
  7.10 Die Funktion main  
 

Die Funktion main, die die Rolle eines Hauptprogramms übernimmt, wird zwar syntaktisch genauso gehandhabt wie alle anderen Funktionen. Sie darf aber nicht im Programm selbst aufgerufen werden.

Die Programmabarbeitung endet mit dem Ende von main (durch ein return oder durch Erreichen des Endes des main-Rumpfs). Wenn z.B. in Fehlersituationen in anderen Funktionen das Programm abgebrochen werden soll, kann man die Funktionen exit(int) und abort(int) verwenden (in stdlib.h deklariert). exit gibt noch belegten Speicher frei und schließt noch offene Dateien, abort dagegen nicht.

Rückgabewert:

Als Rückgabetypen für main sind void und int erlaubt. Der int-Wert wird an das Betriebssystem weitergeleitet und kann dort zum Beispiel als Fehlercode verwendet werden. Ist kein Fehler aufgetreten, sollte man daher das Programm mit return 0; beenden. Ansonsten ist es üblich, durch die Größe der int-Zahl die Schwere des Fehlers zu kennzeichnen.

Der Parameter an exit(int) und abort(int) wird genauso interpretiert.

Die meisten Compiler setzen automatisch ein return 0; am Ende von main ein, wenn man es vergessen haben sollte. Auch, wenn man als Rückgabetyp void angibt, wird intern automatisch eine 0 zurückgegeben.

Parameter aus der Aufrufzeile:

Wichtiger als der Rückgabewert sind die Parameter, die main empfangen kann. Es handelt sich dabei immer um Strings, die den Angaben hinter dem Programmnamen in der Aufrufzeile des Programms erscheinen. (Bei grafischen Benutzeroberflächen und Start durch Anklicken besteht meist auch eine Möglichkeit, diese Parameter anzugeben, z.B. in einem speziellen Requester-Fenster).

Die einzelnen Argumente werden durch Spaces voneinander getrennt -- die Spaces selbst sind dann in den Parametern nicht mehr enthalten. Sollen Spaces innerhalb eines Arguments vorkommen, muß es in Anführungszeichen eingeschlossen werden.

Wenn die Werte beispielsweise numerisch interpretiert werden sollen, muß das Programm eine passende Umwandlung aus den angegebenen Strings selbst vornehmen. Beispielsweise könnte eine Aufrufzeile wie folgt aussehen:

killtabs -i eingabe.dat -o ausgabe.dat -t 8
Die Zeile enthält 7 Argumente, den Namen des Programmes killtabs mitgezählt. Die weiteren Argumente gehören zwar logisch paarweise zusammen (z.B. soll -i eingabe.dat bedeuten, daß aus eingabe.dat gelesen werden soll), diese Interpretation muß aber das Programm durchführen.

Es sind nur folgende Parameterlisten erlaubt:

(void) // Parameter werden ignoriert (int argc, char *argv[]) // Anzahl Parameter, Array der Parameter (int argc, char **argv) // [["]]aquivalent zum 2. Fall
Die Parameternamen sind natürlich nicht so vorgeschrieben, haben sich aber eingebürgert -- sie stehen für argument count bzw. argument vector. argv[0] ist also immer der Programmname (eventuell vom Betriebssystem mit absolutem Pfad ergänzt).

Folgendes Programm gibt einfach die ihm übergebenen Parameter aus. Mit '-' beginnende Angaben werden als Optionen interpretiert und entsprechend in der Ausgabe gekennzeichnet.

void main(int argc, char *argv[]) { cout << "Programmname: " << argv[0] << endl;

for ( int i=1 ; i<argc ; ++i ) if (argv[i][0]=='-') cout << "Option " << (argv[i]+1) << endl; else cout << "Parameter " << argv[i] << endl; }

 
7.9: Pointer auf Funktionen Startseite 8.1: Speicherarten 
 

© 1998 Axel Rogat