Sie sind nun wieder eingeladen, die Diskussion spezieller technischer Probleme mit zu verfolgen. Bitte schicken Sie Fragen, Anregungen oder Antworten zu den vorgestellten Themen – ebenso wie Ihre Kritik – an unsere e-Mail-Adressen: dieter.bender@MidrangeMagazin.de oder Redaktion@MidrangeMagazin.de Frage: Wir haben auf ILE RPG umgestellt – und ich möchte jetzt Subroutinen in Prozeduren umwandeln, damit ich lokale Variablen benutzen kann. Nun habe ich aber festgestellt, dass das Return-Statement in einer ILE-Prozedur anders wirkt, als das Retrn-Statement in der Subroutine eines klassischen RPG-Programms. Wie kann ich ein ILE-Programm in einer Subprozedur verlassen?

Antwort: In einem OPM-Programm bewirkt das Retrn-Statement immer das reguläre Verlassen des Programms und die Rückgabe der Steuerung an das Betriebssystem – egal an welcher Stelle im Programm es steht. Im folgenden Code-Segment wird das Programm also an der Stelle verlassen, wo RETRN codiert ist.

Wenn man nun dieses Programm nach ILE konvertiert und die Subroutine auch noch in eine Subprozedur verwandelt, erhält man folgenden Code:

Dieses Programm verhält sich nun allerdings anders als das Ausgangsprogramm: Nach dem Return in der Subprozedur wird die Steuerung an die Stelle nach dem Callp von HamHam übertragen und das Programm an dieser Stelle weiter ausgeführt. Es wird nicht – wie in der Ausgangsversion – beendet.

In manchen Fällen kann es durchaus sinnvoll sein, an der Aufrufstelle entsprechende Logik einzufügen und abzufragen, ob es weiter gehen soll. An beliebiger Stelle einen Aufruf regulär zu beenden, ist oft ein Zeichen schwacher Programmstruktur. Dasselbe Problem ergibt sich in einer zentralen Exit-Prozedur allerdings genauso. Ein so zentraler Ausgang ist ein Zeichen guten Stils.

Aus anderen Programmen kennt man das Verlassen eines Programms mittels senden einer Escape Message, doch dies signalisiert dem aufrufenden Programm dann ein irreguläres Ende des aufgerufenen Programms. Für mich ist die eleganteste Lösung für dieses Problem das Beenden des Programms durch Aufruf der C-Funktion „Exit“, die an dieser Stelle genau das ermöglicht, was beabsichtigt ist: das reguläre Ende eines Programms in einer Subprozedur mit Rückgabe an das Betriebssystem.
Für die Verwendung von Exit braucht man – wie für alle C-Funktionen – zunächst einen passenden Prototypen, den man am Besten in eine Copy-Strecke auslagert.

Das bindbare API exit() erwartet ein Integer als Parameter und hat keinen Rückgabewert. Für ein normales Beenden wird der Wert 0 übergeben, der in der Copy-Strecke auch als Konstante mit dem Namen EXIT_SUCCESS deklariert ist. Um ein Programm irregulär zu beenden, wird ein Wert zwischen 1 und 255 übergeben, der vom aufrufenden Programm über den Errorlevel abgefragt werden kann. Auch das kann dann über C-Funktionen erfolgen. Die RPG-Möglichkeiten für ein irreguläres Ende – wie Bezugszahl beim Call – oder %error werden ebenfalls bedient.

Die Copy-Strecke muss nun in alle Programme eingebunden werden, die die Funktion „Exit“ verwenden wollen. Für das Binden muss das Binderverzeichnis QC2LE verwendet werden, das allerdings bei neueren Releases nicht angegeben zu werden braucht, weil es automatisch mitverwendet wird.

Statt des nunmehr als Kommentar gekennzeichneten Return-Statements erfolgt nun der Aufruf von Exit mit der Übergabe von EXIT_SUCCESS. Jetzt verhält sich das migrierte Programm wieder exakt so wie vor der Migration.

Den Autor Dieter Bender erreichen Sie unter dieter.bender@midrangemagazin.de