PDA

View Full Version : variable calls im free-format RPG



opeker
12-10-04, 15:58
Hallo !

Nachdem im free-format RPG nur mehr der Befehl "callp" verwendet werden kann, suche ich eine Möglichkeit mit callp variable Programme aufzurufen. Im spaltenorientierten RPG war das kein Problem, da ich beim CALL-Befehl eine Variable angeben konnte.

In meinem konkreten Fall habe ich in einer Steuerungsdatei hinterlegt welche Programme ich unter bestimmten Bedingungen aufrufe. Man kann zwar beim Prototyp unter EXTPGM eine Variable angeben, aber bei callp kann ich dann diese Variable nicht ansprechen, da der Compiler keinen Prototyp dazu findet.

Hat vieleicht irgendwer Tipps für mich um das im free-format zu realisieren?

mfg, Opeker

Fuerchau
12-10-04, 16:03
Da liegt der Hase im Pfeffer !

CALLP ist im Klartext "CALL PROTOTYPE".

Ein variables Programm kann ich nicht per Prototyp aufrufen. Da bleibt mir nur dann wieder der klassische CALL mit PARM, natürlich NICHT im Free-Format.

BenderD
12-10-04, 16:19
Hallo,

Falls es nur darum geht sich den endfree free Zinnober zu ersparen (welcher Hornochse hat nur diesen Compiler geschrieben!!!), dann kann man sich mit einer eigenen Procedure CallMe behelfen, die eine Variable übergeben bekommt und dann einen FixFormat CALL ausführt.

Falls man die Flexibilität der Parametrisierung für einen CALLP haben will, dann kann man sowas mit Procedure Pointern erreichen. Man hat dann einen Prototyp, der an einen ProcedurePointer gebunden ist, belegt erst den ProcedurePointer variable und macht dann einen Callp auf den feststehenden Prototyp. (Dazu gab es mal einen Artikel im Midrange Magazin von mir.

Falls man wirklich dynamisch zur Laufzeit gebundene Calls machen will, dann geht auch das; man kann sich den Procedure Pointer per API aus dem Namen ermitteln, dabei wird auch zur Laufzeit erst gebunden. Dazu gibt es was auf meiner OpenSource Seite zum runterladen.

mfg

Dieter Bender


Hallo !

Nachdem im free-format RPG nur mehr der Befehl "callp" verwendet werden kann, suche ich eine Möglichkeit mit callp variable Programme aufzurufen. Im spaltenorientierten RPG war das kein Problem, da ich beim CALL-Befehl eine Variable angeben konnte.

In meinem konkreten Fall habe ich in einer Steuerungsdatei hinterlegt welche Programme ich unter bestimmten Bedingungen aufrufe. Man kann zwar beim Prototyp unter EXTPGM eine Variable angeben, aber bei callp kann ich dann diese Variable nicht ansprechen, da der Compiler keinen Prototyp dazu findet.

Hat vieleicht irgendwer Tipps für mich um das im free-format zu realisieren?

mfg, Opeker

B.Hauser
12-10-04, 19:13
Hallo Leute,

es ist sehr wohl möglich Programme variabel mit CALLP aufzurufen!

Dabei wird ein Prototyp mit dem Schlüssel-Wort EXTPGM(Variable) erstellt. Der Prototyp wird ins Programm eingebunden und die Variable mit dem Programm-Namen gefüllt.

Beispiel:


D PgmCALL PR ExtPGM(VarPGM)
D Parm1 like(RefFld1)
D Parm2 like(RefFld2)

D VarPGM S 10A
*------------------------------------------------------
/Free
VarPGM = 'MYPGMNAME';
CallP PgmCALL(MyParm1: MyParm2);

VarPGM = 'MYPGM2';
PgmCall(MyParm1: MyParm2);
/End-Free


Das ist doch einfacher als ein Programm in eine Prozedur zu verwandeln und dann Prozedur Pointer und API-Aufrufe einzusetzen oder?

Wie bereits festgestellt heisst CALLP (call with Prototype) und nicht mehr wie ursprünglich call procedure. Die Namensänderung wurde zu dem Zeitpunkt eingeführt als man auch für Programme Prototyping nutzen konnte (Release V4R3 oder so).

Birgitta

Fuerchau
12-10-04, 20:08
@Birgitta
Meine Hochachtung. Wie immer, gewusst wo !
Funktioniert das auch mit Prozeduren ?

B.Hauser
12-10-04, 20:41
@Birgitta
Meine Hochachtung. Wie immer, gewusst wo !
Funktioniert das auch mit Prozeduren ?

Leider nein!
Bei Prozeduren muss man mit Procedure Pointern arbeiten.


D ProcDSIN PR ExtProc(MyProcPtr)
D ParmDSIN like(DSIN)

D MyProcPtr S * ProcPtr
/Free
MyProcPtr = %PAddr('MYPROCEDURE');
ProcDSIN(MyDSIN);
/End-Free


Birgitta

opeker
13-10-04, 07:05
Hallo !

Vielen Dank für die rasche Antwort und die vielen Tipps. Der Tipp von Birgitta war für mich goldrichtig. Ich habe bei meinem Versuch blöderweise (wie beim alten CALL) die Variable aufgerufen und daher hat es nicht funktioniert.

mfg, Opeker