-
-
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...
-
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
-
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.
-
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
PHP-Code:
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; //------------------------------------------------------------------//
-
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.
-
Nur mal so eine Frage:
Werden das Programm und die Prozedur in der gleichen Aktivierungsgruppe ausgeführt?
Birgitta
-
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.
-
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....
-
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.
-
Zitat von Fuerchau
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.
In Java übergibst du Objekte und primitive Datentypen (int, long, char, ...)
Objekte sind Instanzen von Klassen und befinden sich im Heap und es wird nur die Speicheradresse (Pointer) übergeben.
Und du könntest folgendes schreiben:
Code:
public Object getObject() {...}
Da ja alle Klassen von der Klasse Object erben, musst du hier die Klasse vom zurückgegebenen Objekt prüfen.
In PHP z.B. werden auch immer Pointer bei Parametern übergeben. Erst wenn der Wert sich ändert, wird eine Kopie vom Objekt mit einer neuen Adresse erstellt. Dadurch wirkt es von außen, als würde der Wert statt des Pointers übergeben werden.
Wenn ich das "&" beim Parameter dazuschreibe definiere ich damit, dass auch beim Ändern das gleiche Objekt verwendet werden soll.
Also es gibt sehr wohl ähnlichkeiten, jedoch kann das Speicherverhalten von jeder Programiersprache unterscheiden.
Similar Threads
-
By dabeda in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 05-03-15, 12:53
-
By CaddyMajor in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 25-06-14, 08:22
-
By lorenzen in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 12-12-02, 16:46
-
By Sven Schneider in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 03-09-02, 07:31
-
By lorenzen in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 27-08-02, 14:59
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks