PDA

View Full Version : rpgle Array übergeben



codierknecht
08-11-07, 15:06
Hallo,
kann man in RPGLE ein Array mit einem Serviceprogramm austauschen und wie muss ich das definieren.
Ich habe es in etwa so versucht:

Programm was aufruft:

D array s 5a dim(10)
D z s 3i 0 inz(1)
d srfpgm pr like(GNEvent)
d array# like(array)

callp srfpgm(array(z));
*------------------------------------------------
Serviceprogramm was das Array füllen soll.

D array s 5a dim(10)
D z s 3i 0 inz(1)
d srfpgm pr ike(GNEvent)
d array# like(array)


p srfpgm b export
d srvpgm pi like(GNEvent)
d array# like(array)

array#(1) = 'TEST';
array#(2) ='TEST1';

return true;

im Programm was aufruft sind die Werte jetzt aber nicht gefüllt. Ich glaube auch nicht das es so geht. Ich habe es noch mit Pointern versucht, was ich auch nicht hin bekommen habe. Wie macht man das?

Fuerchau
08-11-07, 15:13
Der CALL muss hier "By Reference" also ohne "value" aufgerufen werden.

callp srfpgm(array);

ist somit richtig.

mit
callp srfpgm(array(z));
übergibst du nur die Adresse des Elements Z des Arrays und das führt zu Pufferüberschreibungen (MCH-Fehler wäre noch die beste Variante daraus).

Besser wäre noch, die Anzahl der verfügbaren Elemente mit zu übergeben, dann wäre es etwas dynamischer.

B.Hauser
08-11-07, 15:47
Hallo,

Bei der Definition über Like muss die Dimension immer zusätlich mit angegeben werden.

Like nimmt nur die Feldbeschreibung.

Bei der Kompilierung wird neben der Felddefinition auch die Anzahl der Feldgruppen-Elemente geprüft. Weichen diese von der Original-Definition ab, erfolgt ein Compile-Fehler. Es sei den die Parameter wurden mit Const oder Value definiert.

In deinem Programm ist kein Compile-Fehler aufgetreten, da nur ein einzelnes Feld definiert war, und Du auch nur ein Feldgruppen-Element, also wiederum nur ein einzelnes Feld übergeben hast.

Die Schlüsselworte VALUE oder CONST können nur für Input Only Parameter verwendet werden. Bei VALUE wird ein neues Feld (auch Feldgruppe) erzeugt, mit der erwarteten Definition, Datentyp, Länge und Anzahl Feldgruppenelemente und mit dem übergebenen Wert intitalisiert. Anschließend wird diese Kopie an die rufende Prozedur übergeben. Bei CONST wird nur dann ein neues Feld erstellt, wenn die Parameterdefinition abweicht.

Übrigens vergiss die Geschichte mit Pointer übergeben, da mit Ausnahme der Parameter, die mit VALUE definiert sind, sowieso ein Pointe, also die Adresse des Parameterfeldes übergeben wurde.

Die Anzahl an Feldgruppenelemente als Parameter zu übergeben, würde ich nur dann, wenn die Feldgruppe viele Elemente hat, vondenen nur wenige gefüllt sind. Zur Prüfung, ob die richtige Anzahl an Elementen übergeben wurde, trägt diese Information nicht unbedingt bei, da das Ganze über Prototyping geprüft wird.

Birgitta

codierknecht
08-11-07, 16:07
Vielen dank für die schnellen Antworten. Das Programm funktioniert mittlerweile. Nochmals danke

Fuerchau
08-11-07, 17:51
Prototyping ist leider absolut unsicher (zieht nur zur Compilizeit), da ich nachträglich das Serviceprogramm ändern kann ohne alle anderen Programme mitzuändern, was dann ggf. zu Problemn führt.

Die Anzahl der Elemente ist da schon sicherer, da ich das Servicemodul dann flexibler erweitern kann.

BenderD
09-11-07, 07:47
Hallo,

wenn ich nicht mit Signaturen rumspiele, dann lässt sich das geänderte Serviceprogramm nicht mehr aufrufen, bevor man neu gebunden hat - man muss da schon aktiv sagen, dass man Huddel haben will.

mfg

Dieter Bender


Prototyping ist leider absolut unsicher (zieht nur zur Compilizeit), da ich nachträglich das Serviceprogramm ändern kann ohne alle anderen Programme mitzuändern, was dann ggf. zu Problemn führt.

Die Anzahl der Elemente ist da schon sicherer, da ich das Servicemodul dann flexibler erweitern kann.