PDA

View Full Version : Subroutine lässt sich nicht beenden



Mr.iSeries
22-05-09, 08:09
Hallo!
Habe folgendes Problem.
In meinem Anzeigeprogramm springe ich von einer Subroutine in eine andere je nachdem welche Funktionstaste der Benutzer drückt. in der jeweiligen SR frage ich ab was gedrückt wurde. Es kann also passieren dass die gleiche SR öfter aufgerufen wird obwohl sie vorher schon X mal aufgerufen wurde und noch nicht beendet ist. Hoffe ihr versteht was ich meine. Solange nicht Datenfreigabe gedrückt wird können X mal viele Subroutinen noch offen sein.

Mein Problem ist dass die AS/400 dann beim Beenden der SR sich irgendwie aufhängt und in Endlosschleife läuft.
Beim Debug habe ich gesehen dass er den LEAVESR ausführt, zum ENDSR springt, dann in die vorherige SR geht, wieder den LEAVSR ausführt, zum ENDSR geht, jedoch dann wieder in die vorherige SR zurückgeht und immer zwischen LEAVSR und ENDSR Schleife läuft.

Werd noch wahnsinnig. Keine Ahnung was der da macht. Normalerweise müsste er alle SR richtig beenden und wieder zum Programmanfang kommen aber irgendwie packt er das nicht. Habt ihr ne Ahnung was da falsch sein könnte? Vielen Dank

BenderD
22-05-09, 08:40
das Programm Design!!!
Finger weg von GOTO, dann passiert sowas nicht!!!

D*B


Habt ihr ne Ahnung was da falsch sein könnte? Vielen Dank

Mr.iSeries
22-05-09, 08:52
Ich Programmiere im Free-Format!
Ich benutze kein Goto!
Ich verzweige lediglich von einer SR in die nächste und immer weiter. Jedoch sollte er irgendwann die Subroutinen beenden aber dabei hängt er sich auf.

Heyden
22-05-09, 10:43
Hallo,

so, wie der Fehler beschrieben ist, wird das Format nicht gelesen. Da die betätigten Tasten ermittelt werden sollen, bleit der Prozess normalerweise immer beim Lesen des Formats stehen.

Weiter kann es sein, daß die Bedingungen für die äusseren Schleifen noch gesetzt sind. Diese vielleicht vorher initialisieren.


Gruss

S. Heyden

Fuerchau
22-05-09, 11:00
Eine Rekursion einer Subroutine ist nicht möglich !

Ein EXSR ist keine echte Unterroutine sondern wird von RPG(LE) als GOTO behandelt.
Beim ENDSR wird ein variabler GOTO verwendet, der beim EXSR gesetzt wird.
Bei der Rekursion zerstört also ein EXSR das Setzen der Rücksprungadresse eines vorherigen EXSR, so dasss nicht mehr korrekt zurückgesprungen werden kann.

Wenn du Free verwendest, bieten sich hier eben eher Funktionen/Prozeduren an.
Diese können rekursiv arbeiten, besitzen lokale Variablen und können auch (eher unschönes Design) auf globale Variablen/Dateien zugreifen.

Mr.iSeries
25-05-09, 07:59
Eine Rekursion einer Subroutine ist nicht möglich !

Ein EXSR ist keine echte Unterroutine sondern wird von RPG(LE) als GOTO behandelt.
Beim ENDSR wird ein variabler GOTO verwendet, der beim EXSR gesetzt wird.
Bei der Rekursion zerstört also ein EXSR das Setzen der Rücksprungadresse eines vorherigen EXSR, so dasss nicht mehr korrekt zurückgesprungen werden kann.

Wenn du Free verwendest, bieten sich hier eben eher Funktionen/Prozeduren an.
Diese können rekursiv arbeiten, besitzen lokale Variablen und können auch (eher unschönes Design) auf globale Variablen/Dateien zugreifen.

genau das macht er auch im DEBUG er springt zum falschen EXSR.

Vielen Dank für die Erklärung.
Habs im Programm jetzt anders gelöst

B.Hauser
25-05-09, 09:28
Ich würde vermuten, dass die Quelle und das Objekt nicht übereinstimmen und zunächst einmal das Programm neu erstellen.

Birgitta

Mr.iSeries
25-05-09, 10:41
Ich würde vermuten, dass die Quelle und das Objekt nicht übereinstimmen und zunächst einmal das Programm neu erstellen.

Birgitta

Nein daran liegt es definitiv nicht. Es ist genauso wie Fuerchau es beschrieben hat. Wenn die gleiche SR noch einmal angesprochen wird bevor die davorige (gleiche Subroutine) noch nicht beendet wurde, kommt er durcheinander.