PDA

View Full Version : *entry PList in free



ReKoR
18-11-09, 15:54
Hallo,

habe in einem PGM die *entry PList durch free ersetzt. Also mit H-Bestimmung Main(...) und Prozedur.

Das funktioniert jetzt auch soweit, aber nur beim ersten Aufruf. Danach sind meine Variablen nicht initialisiert. Ich habe das zumindest für die F3-Taste geprüft. F3 ist noch an. Wieso das? Wurde das PGM nicht richtig beendet? Was ist richtig *inLR oder return?

Gruß Andreas

B.Hauser
19-11-09, 07:43
Sehe ich das richtig, dass Du nicht einfach die *ENTRY PLIST durch Procedure Interface und Prototyp ersetzt, sondern dass Du versuchst die neuen Freatures in Release 6.1 zu nutzen.

Wenn es nur darum geht die *Entry PList zu ersetzen hätte ich alles gelassen wie es ist und einfach Prototyp (mit Schlüsselwort EXTPGM) und Procedure Inteface eingebunden.

Wenn Du die neuen Features in 6.1 verwendest, also den Programm-Code in eine Procedure (mit P-Statement zu Beginn und Ende) packst und MAIN in den H-Bestimmungen angibst, klemmst Du den Zyklus ab. Der Zyklus macht im Hintergrund schon das eine oder andere selber und *INLR ist Zyklus!

Weiterhin solltest Du beachten, wenn du schon eine Prozedur für das Programm machst, solltest Du auch die Dateien lokal definieren. Dann werden sie beim Aufruf automatisch geöffnet und beim Verlassen der Prozedur geschlossen (es sei den das Schlüssel-Wort STATIC ist in den F-Bestimmungen angegeben oder die Dateien werden user controlled geöffnet). Wenn die Dateien global definiert sind, erfolgt das Öffnen zwar automatisch beim 1. Aufruf (wie innerhalb eines Moduls für Service-Programme), sie bleiben jedoch offen und werden nicht geschlossen wenn die Main-Prozedur mit Return (anders geht es nicht!) beendet wird.

Birgitta

ReKoR
19-11-09, 09:44
Das Programm ist RPG IV und wird entweder direkt aus dem Menü oder von einem anderen RPG-Programm aufgerufen. Es gibt einen Eingansparameter, der gefüllt ist, wenn das Programm aus dem anderen Programm aufgerufen wird.

Ich habe nun ein bischen geübt und das Hauptprogramm in free umgeschrieben. Da es aber keine Entsprechung für *entry PList in free gibt, habe ich nach einer Lösung gesucht. Sicherlich ist der völlige Verzicht auf das Hauptprogramm und die Deklaration der Dateien in Prozeduren richtig, ich muss das aber nicht zwingend umsetzen. Das kann ich mir auch bei einer Neuentwicklung vornehmen. Fehler ist bei mir sicher, dass die Dateien noch global definiert sind.


Wenn es nur darum geht die *Entry PList zu ersetzen hätte ich alles gelassen wie es ist und einfach Prototyp (mit Schlüsselwort EXTPGM) und Procedure Inteface eingebunden.
Das versteh ich nicht ganz. Erklär das mal bitte genauer. :confused:

B.Hauser
19-11-09, 13:05
Das versteh ich nicht ganz. Erklär das mal bitte genauer.

Deine bestehende Quelle hat ungefähr wie folgt ausgesehen:


H-Bestimmungen
F-Bestimmungen
D-Bestimmungen
C-Bestimmungen
C Entry PList im klassischen Format
C/Free
Sonstiger Source-Code
C/End-Free
ggf. noch ein paar interne Prozeduren

Du musst lediglich die *ENTRY-PList entfernen und dafür in den D-Bestimmungen ein Procedure Interface anlegen. Und da Prototyping immer Procedure Interface und Prototyp benötigt, muss in den D-Bestimmungen noch der Prototyp (mit Schlüssel-Wort EXTPGM damit der Compiler zwischen Prozedur und Programm unterscheiden kann) angelegt werden. Anstatt den Prototypen direkt in der Quelle zu hinterlegen hätte sollte man ihn in einer Copy-Strecke angeben.

Neu sieht das Ganze so aus:

H-Bestimmungen (MAIN ist nicht notwendig!!!)
F-Bestimmungen
D-Bestimmungen
* Prototyp sollte in Copy-Strecke hinterlegt sein.
D MyPGM PR ExtPGM('MYPGM')
D Par1 10A
D Par2 7P 0

*Procedure Interface (statt *ENTRY PLIST)
D MyPGM PI
D Par1 10A
D Par2 7P 0

* Sonstige D-Bestimmungen
C*** Entry PLIST entfällt
/Free
Sonstiger Source Code
/End-Free

Birgitta

ReKoR
19-11-09, 15:18
Ja, ich denke, das ist das richtige für mich. Werde ich probieren und das Ergebnis mitteilen.

Danke soweit :)

* E * D * I * T *

Hat super geklappt. Danke sehr und schönes WE!