PDA

View Full Version : Problem mit Pointern und Procedure



Seiten : [1] 2

ExAzubi
29-07-15, 16:14
Hallo,

ich habe ein PGM mit einer SubProcedure welche mir einen Pointer auf ein Array zurückgibt. Allerdings scheint der Speicherbereich des Arrays in der SubProcedure zerstört zu werden...

Hier ein bißchen Code :)



d ArtikelArray s 10A dim(999) based(pArtikelArray)
d pArtikelArray S *
*
d getArtikel PR *
d Mat 10A value
*
C eval pArtikelArray = getArtikel('MATERIAL')
*
C EVAL *inlr = *ON
************************************************** ************************
P getArtikel B export
*
D getArtikel PI *
D Einsatz 10A value
*
d arrEins S 10A dim(999)
d ax S 3S 0 inz(0)
*
d arrArtikel S 10A dim(999) inz(*HIVAL)
*
d bx S 3S 0 inz(0)
d parrArtikel S *
d i S 3S 0 inz(0)
*
.... arbeiten
C EVAL parrArtikel =%ADDR(arrArtikel)
*
C return parrArtikel
*
P getArtikel E



Beim return in der SubProcedure ist das Array arrArtikel sauber gefüllt. Beim *INLR in der Mainline ist das Array ArrayArtikel in einigen Elementen nicht mehr in Ordnung? Es stehen seltsame Sonderzeichen drin. :(

Wo ist der Fehler?

Danke an allen Helfenden!

RobertMack
29-07-15, 16:32
In solchen Fällen würde ich mit Pi (Entry Parm) = 0 oder *Off arbeiten und so jeden Aufruf mit Return verlassen. Am Ende des aufrufenden Programmes dann ein extra call mit Pi = *On - um das Ding aus dem HSP zu entfernen...

Pikachu
29-07-15, 16:47
Was willst du mit dem Inhalt einer lokalen Variable außerhalb ihrer Prozedur?

Storage of Definitions

Local definitions use automatic storage. Automatic storage is storage that exists only for the duration of the call to the procedure. Variables in automatic storage do not save their values across calls.

Global definitions, on the other hand, use static storage. Static storage is storage that has a constant location in memory for all calls of a program or procedure. It keeps its value across calls.

Specify the STATIC keyword to indicate that a local field definition use static storage, in which case it will keep its value on each call to the procedure. If the keyword STATIC is specified, the item will be initialized at module initialization time. [...]

Quelle (http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092508413.htm#HDRSTORDEF)

Fuerchau
29-07-15, 17:02
Dies ist soweit korrekt.
Eine Funktion/Prozedur kann keine Werte auf temporären Speicher zurückgeben.
Allerdings kannst das Array als Ergebnis zurückgeben, was hier aber ggf. keinen Sinn macht da du mit dem globalen Array (ohne "based") arbeiten kannst.

Rainer Ross
02-08-15, 15:31
Hallo Forum,

ich arbeite sehr gerne mit Pointern und free RPG und habe zwei Ideen zum obigen Programm.

- im Header arbeite ich mit der Option *teraspace.
- es wäre auch möglich, das ArtikelArray als Adresse an die Prozedur zu übergeben

Herzliche Grüße

Rainer





ctl-opt dftactgrp(*no) alloc(*teraspace) option(*nounref);

dcl-pr getArtikel;
Mat char(10) const;
Array_p pointer const;
end-pr;

dcl-s ArtikelArray char(10) dim(999);

getArtikel('MATERIAL':%addr(ArtikelArray));

*inlr = *on;
//------------------------------------------------------------------//
// Procedure - getArtikel //
//------------------------------------------------------------------//
dcl-proc getArtikel export;
dcl-pi *n;
##Einsatz char(10) const;
##array_p pointer const;
end-pi;

dcl-s arrArtikel like(ArtikelArray) based(##array_p);

dcl-s arrEins char(10) dim(999) inz(*hival);
dcl-s ax uns(10) inz(0);

end-proc;
//------------------------------------------------------------------//

Fuerchau
02-08-15, 17:11
Ich kann aber auch dann keinen Pointer auf temporären Speicher zurückgeben, da der Inhalt mit jedem neuen Call-Entry (auch z.B. BuiltIn-Funktionen) überschrieben wird.

B.Hauser
02-08-15, 17:31
Nur mal so eine Frage:
Werden das Programm und die Prozedur in der gleichen Aktivierungsgruppe ausgeführt?

Birgitta

Fuerchau
03-08-15, 07:56
Das ist nicht relevant. Klar ist ja wohl, dass bei der Übergabe eines statischen Speichers über 2 Aktivierungsgruppen natürlich beide noch aktiv sein müssen.

ExAzubi
03-08-15, 08:58
Es scheint so zu sein, wie von Fuerchau beschrieben: Lokaler Speicher wird beim verlassen der Procedure andersweitig verwendet.
Ich dachte es ist eib bisschen wie JAVA, solange eine Referenz vorhanden ist, bleibt der Speicher reserviert. Naja, dann mach ich es halt anders. (Lokale Variable in globale Variable umgeändert...)

Trotzdem Danke an alle Helfenden....

Fuerchau
03-08-15, 09:24
Mit Java kann man das nicht vergleichen, denn es gibt da keine Unterscheidung zwischen statischem und temporären Speicher.
Hier ist der sog. Scope für die Existenz wichtig. Außerdem kann man in Java keine Pointer zurückgeben sondern nur Klassen und Einzeltypen (Double, Int, ...). Bereits der String ist eine Klasse mit Speicher aus dem Heap.