Zitat Zitat von Fuerchau Beitrag anzeigen
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