
Zitat von
Fuerchau
Bist du sicher, dass die Variable auch im aufrufenden Programm verändert wurde ?
Das wäre dann ein Bug (der allerdings bei RPGLE durchaus verständlich ist).
Mit den beiden angehängten Programmen kann man es selbst testen. Selbst der Aufruf mit der Konstante führt zu keinem Fehler im aufrufenden Programm.
Ich stimme natürlich zu, dass ein Interface besser wäre. Bei neuen Programm handhaben wir das auch so. Das würde aber den Aufwand bei alten Programmen nicht rechtfertigen. Die Programme würden dann einfach weiterhin mit CALL aufgerufen werden.
Mal abgesehen von der Frage, ob die auf Interface umgestellten Programme dann aus den anderen alten Programmen mit CALL heraus noch korrekt aufgerufen werden können.
Generell sollte der Prototyp, zur Sicherheit, aber nur bei den Variablen CONST enthalten die im aufgerufenen Programm nicht verändert werden und auf gar keinen Fall bei Variablen die als Rückgabewert dienen sollen, damit diese Variablen nicht aus Versehen als Konstante übergeben werden können. Auch wenn es anders scheinbar auch funktioniert.
PHP-Code:
.
D VAR1 S 1
D VAR2 S 2
D VAR3 S 3
C *ENTRY Plist
C Parm VAR1
C Parm VAR2
C Parm VAR3
C Movel VAR1 VAR3
C Move VAR2 VAR3
C Eval *inlr = *on
PHP-Code:
.
H main(Main)
H DFTACTGRP(*NO)
H ACTGRP(*NEW)
DMain PR extpgm('TESTPGM')
DCALLPGM PR extpgm('TESTCALL')
D EXT_VAR1 1A const
D EXT_VAR2 2A const
D EXT_VAR3 3A const
PMain B
D PI
DVAR1 S 1A
DVAR2 S 2A
DVAR3 S 3A
/free
VAR1 = 'A';
VAR2 = 'BC';
VAR3 = 'XYZ';
CALLPGM(VAR1:VAR2:VAR3);
dsply (VAR1); //--> Ausgabe: A
dsply (VAR2); //--> Ausgabe: BC
dsply (VAR3); //--> Ausgabe: ABC
VAR1 = 'A';
VAR2 = 'BC';
VAR3 = 'XYZ';
CALLPGM(VAR1:VAR2:'XYZ');
dsply (VAR1); //--> Ausgabe: A
dsply (VAR2); //--> Ausgabe: BC
dsply (VAR3); //--> Ausgabe: XYZ
/end-free
P E
Bookmarks