Anmelden

View Full Version : EXTPGM-Parameterliste



Seiten : [1] 2

tarkusch
24-01-13, 11:31
Hätte gerne meinen Code ganz in free geschrieben, bin aber da auf ein Problem gestossen.

Ich habe eine Parameterliste(CHK03R) die 50 lang ist.
Im aufgerufenen Programm ist aber die *entry-Parameter 51 lang.

Kann ich in free den Parameter RC „dazuhängen“, falls ja bitte wie?

Habe es so versucht ging aber leider nicht:
CheckCode(CHK03R:RC);

Kann ich beim Aufruf einen EXTPGM auf fehlerhafte Beendigung abfragen,
oder muss ich es in einen MONITOR-Anweisung schreiben.



D CheckCode PR EXTPGM('CHKCD01R')
D CHK03R DS 50 INZ
D PaSL3 1 2 0
D PaCD3 3 5
D PaBZ3 6 30
D PaKB3 31 35

C CALL 'CHKCD01R'
C PARM CHK03R
C PARM RC


Aufgerufenes Programm hat in der *entry-Anweisung:


*ENTRY PLIST
PARM PARAMS 50
PARM RC 1

Dank im Voraus

Pikachu
24-01-13, 12:05
(1) Nach "CheckCode PR ..." fehlen noch die einzelnen Parameter des Programms. Siehe hier Abbildung 232. (http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c0925083624.htm) Die Datenstruktur "CHK03R DS ..." ist eigenständig und gehört nicht dazu.

(2) callp(e) CheckCode(CHK03R:RC) und danach Abfrage der Variable %error (http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c0925083563.htm#HDRBBERROR).

dschroeder
24-01-13, 13:41
Meiner Meinung nach musst die Datenstruktur im Prototyp mit "likeds" definieren. Dann kannst du weitere Parameter anhängen.

Gruß,
Dieter

tarkusch
24-01-13, 15:41
Ich habe versucht den Parameter anzuhänger, bekomme aber da einen Fehler.

Muss ich da qualified angeben?
Mir ist nur nicht klar wo.


D CheckCode PR EXTPGM('CHKCD01R')
D CHK03R DS 50 INZ
D PaSL3 1 2 0
D PaCD3 3 5
D PaBZ3 6 30
D PaKB3 31 35

D ParCHK03R DS likeds(CHK03R)
D redturnCode 1a

*RNF3703 20 a 013200 Unterfeld- oder Parameterdefinition nicht in einer Gruppe
angegeben.

Pikachu
24-01-13, 16:01
Probiers mal so (ohne Gewähr):


D CheckCode PR EXTPGM('CHKCD01R')
D P1 LIKE(CHK03R) CONST
D P2 LIKE(RC)
D
D CHK03R DS 50 INZ
D PaSL3 1 2 0
D PaCD3 3 5
D PaBZ3 6 30
D PaKB3 31 35

D RC S 1

/free
callp(e) CheckCode(CHK03R:RC);
eval *inlr = *on;
/end-free

dschroeder
24-01-13, 16:21
Hallo,
ich glaube eher, dass man die Struktur nicht direkt im Prototyp definieren darf. Man muss sie unabhängig vom Prototyp deklarieren und dann im Prototyp mit likeds darauf verweisen.

Hier der Code:

D CHK03R_Templ DS 50 Template
D PaSL3 1 2 0
D PaCD3 3 5
D PaBZ3 6 30
D PaKB3 31 35
*
D CheckCode PR EXTPGM('CHKCD01R')
D CHK03R LIKEDS(CHK03R_Templ)
D RC 1A

/free
callp(e) CheckCode(CHK03R:RC);
eval *inlr = *on;
/end-free

Bei diesem Code ist die Struktur im Prototyp einfach ein einzelner Parameter, der mit LIKEDS auf eine Strukturdefinition verweist.

Möglicherweise kannst du die Struktur auch nicht mit CONST deklarieren. Das geht nur, wenn dein Programm CHKCD01R das auch als CONST empfängt.

Gruß,
Dieter

Fuerchau
24-01-13, 17:28
Const dient für den Compiler nur als Definition, dass der Inhalt nicht verändert wird.
Übergeben wird trotzdem nur eine Adresse.
Der Empfänger benötigt kein Const.
Const hat noch dann den Vorteil, wenn ich Ausdrücke an eine Funktion übergeben will und nicht immer erst eine Variable füllen muss.

BenderD
24-01-13, 21:14
Const dient für den Compiler nur als Definition, dass der Inhalt nicht verändert wird.
Übergeben wird trotzdem nur eine Adresse.
Der Empfänger benötigt kein Const.
Const hat noch dann den Vorteil, wenn ich Ausdrücke an eine Funktion übergeben will und nicht immer erst eine Variable füllen muss.

... die Hoffnung stirbt zuletzt. RPG stellt vielleicht sicher, dass die Variable nicht verändert wird, wenn sie durchgereicht wird, ist dem Compiler das völlig egal. Der Versuch wird bereits mit einem Programm belohnt, wie so oft, bei der Huddel Programmiersprache RPG.

D*B

tarkusch
25-01-13, 09:24
Hallo,
ich glaube eher, dass man die Struktur nicht direkt im Prototyp definieren darf. Man muss sie unabhängig vom Prototyp deklarieren und dann im Prototyp mit likeds darauf verweisen.

Hier der Code:

D CHK03R_Templ DS 50 Template
D PaSL3 1 2 0
D PaCD3 3 5
D PaBZ3 6 30
D PaKB3 31 35
*
D CheckCode PR EXTPGM('CHKCD01R')
D CHK03R LIKEDS(CHK03R_Templ)
D RC 1A

/free
callp(e) CheckCode(CHK03R:RC);
eval *inlr = *on;
/end-free

Bei diesem Code ist die Struktur im Prototyp einfach ein einzelner Parameter, der mit LIKEDS auf eine Strukturdefinition verweist.

Möglicherweise kannst du die Struktur auch nicht mit CONST deklarieren. Das geht nur, wenn dein Programm CHKCD01R das auch als CONST empfängt.

Gruß,
Dieter


Hallo,

habe es mit Likeds versucht, aber ich kenne den Ausdruck Template nicht bzw. habe auch mit dem noch nicht gearbeitet.

gehört beim Callp(e) CheckCode(CHK03R:RtnCode); nicht das RtnCode entfernt?

Was habe ich da vermurkst?



D CHK03R_Templ DS 50 Template
D PASL3 1 2 0
D PACD3 3 5
D PABZ3 6 30
D PAKB3 31 35
D*
D CheckCode PR EXTPGM(' CHKCD01R')
d
d CHK03R DS likeds(CHK03R_Templ)
d RtnCode 1a
======> aa
*RNF3703 20 a 013300 Unterfeld- oder Parameterdefinition nicht in einer Gruppe
angegeben.
/FREE
PACD3 = 'TEST';
PASL3 = *ZEROS;
======> aa
*RNF0655 30 2 Der mit dem Schlüsselwort TEMPLATE definierte Eintrag kann in

Callp(e) CheckCode(CHK03R:RtnCode);
*RNF5407 20 2 Mehr Parameter im Prototypaufruf übergeben als zulässig.

IF RtnCode = '0';
// Error in ...
EndIf;
/END-FREE

dschroeder
25-01-13, 09:39
Template bedeutet, dass die Struktur nur eine "leere" Vorlage ist. Für eine Template-Struktur werden nur 16 Bytes Speicher belegt. Du brauchst die Struktur ja nicht wirklich für den Prototyp. Du benötigt an der Stelle ja nur die Strukturdefinition (ohne Daten). Deshalb habe ich da Template hingeschrieben. Das geht natürlich auch ohne "Template". Dann musst du aber einen andere Namen für die Struktur verwenden (du kannst dich bei likeds ja schließlich nicht auf dich selbst beziehen).

Dein Problem mit der Fehlermeldung ist das "DS". Da die Struktur nicht selbständig ist, sondern nur ein Parameter des Prototyps, darf da kein DS stehen:
D CheckCode PR EXTPGM(' CHKCD01R')
d
d CHK03R likeds(CHK03R_Templ)
d RtnCode 1a

Gruß,
Dieter