-
Pointerübergabe an Serviceprogramm
Hallo zusammen,
ich habe eine Frage zur Übergabe von Pointern an ein SRVPGM.
Folgende Konstellation:
1) Funktion1 aus einem Serviceprogramm liefert einen Pointer zurück, der auf ein 3-stellige Alpha Feld zeigt.
2) Funktion2, welches sich in dem selben Serviceprogramm wie Funktion1 befindet, bekommt den Pointer als Inputparameter.
3) In der Implementierung der Funktion2 soll der Pointer wieder dereferenziert werden und mir den Inhalt des 3-stelligen Feldes liefern.
Schaue ich mir den Inhalt des Inputparameters im Debug in der Funktion2 an steht dort die richtige Adresse. Jedoch wird mir bei der Dereferenzierung nicht der Inhalt des Feldes zurückgegeben, sondern nur Blanks bzw. das Programm sagt "Inhalt nicht verfügbar".
Wenn ich die Dereferenzierung im Programm durchführe, das beide Funktionen aufruft, kann ich den Inhalt ohne Probleme auslesen.
Warum klappt dies nicht bei der Dereferenzierung im SRVPGM? Oder ist das so generell nicht möglich?
Vielen Dank für eure Hilfe!
-
Generell ist das möglich, sollte aber aus Sicherheitsgründen nicht so gemacht werden.
Wenn du einen Pointer an eine Funktion übergibst, so sollte sie als "value" übergeben werden, da du sonst die Adresse des Pointers bekommst.
Schau dir deine Definitionen genau an!
Eine Funktion darf keine Adresse aus seinem lokalen Speicher zurückgeben, da nach Return die Adresse nicht mehr gültig ist. Dies ist nur mit globalen (bzw. Static) Variablen möglich.
Gutes Design ist das nicht, da du dann von außerhalb Inhalte verändern oder zerstören kannst.
Ein Pointer zeigt nur auf eine Adresse, was dahinter gespeichert ist, kann allenfalls MCH-Fehler auslösen. und zeigt ansonsten Unsinn.
-
Das ist mir durchaus bewusst, jedoch vom Auftraggeber so gewünscht.
Der Auftraggeber versucht durch das Übergeben von Pointern dem Aufrufer zu verschleiern, um was für Felder es sich handelt, um das Feld oder die DS als "RPG-Objekt" zu behandeln.
Wenn die lokale Adresse nach Return nicht mehr gültig ist, warum kann ich dann im aufrufenden Programm nach dem Return darauf zugreifen?
-
Weil dann der Adress-Bereich wieder neu belegt wird.
Lokale Variablen einer Funktion liegen im Stack.
Die bessere Alternative ist, eine Variable zu exportieren, auf die dann per Import zugegriffen werden kann.
-
... normalerweise helfe ich ja nicht krummes Design zu implemetieren...
aber wenn man es richtig macht, geht das:
in jedem Fall die Variable im static storage anlegen (am einfachsten global im Modul)
Variante a)
Übergabe der Variable(!!!) per Reference (dann braucht es keine Referenzierung/Dereferenzierung und auch keine explizite Rückgabe)
Variante b)
Übergabe des Pointers by Value
D*B
-
Hat geklappt!
Vielen Dank
Similar Threads
-
By claudia_669 in forum NEWSboard Programmierung
Antworten: 9
Letzter Beitrag: 10-07-12, 08:11
-
By mihael in forum NEWSboard Server Software
Antworten: 0
Letzter Beitrag: 13-03-09, 13:23
-
By Hubert in forum NEWSboard Programmierung
Antworten: 9
Letzter Beitrag: 16-11-07, 08:44
-
By jo400 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 17-11-06, 13:21
-
By THH in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 17-12-05, 11:51
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