Wie ich eingangs erwähnte hat da nun jeder seine eigene Meinung.
Diese Diskussion hatten wir schon des öfteren.
Wie heißt's doch so schön: "Jeder ist seines Gückes...".
Noch mal zurück bezgl. CONST:
Ihr habt recht, was die Adresse angeht:
Bei CONST wird ggf. keine Kopie erstellt sondern tatsächlich bei Reference.
Solange die aufgerufene Prozedur dies mittels CONST auch so definiert ist eine Änderung nicht möglich.
Der Compiler weist Zuweisungen (auch bei Strukturen) sowie %ADDR() auf ein CONST ab.
Definert man die Prozedur extern dann ohne CONST ist ein Ändern der Struktur tatsächlich möglich.
Für die Aufruffunktion gibt es keine Signatur, die zur Laufzeit geprüft wird, so dass hier auch der Binder (CRTPGM) scheitert.
Sicherheit bietet hier VALUE.
Bei VALUE wird der Inhalt auf den STACK gelegt, also grundsätzlich kopiert. Die aufgerufene Funktion kann den Parameter auch wirklich nur verarbeiten, wenn er auf VALUE definiert ist. Bei einer Definition als CONST oder als Referenz gibt es einen Zeigerfehler beim Zugriff.
VALUE-Werte sind zur Laufzeit änderbar ohne den Aufrufer zu stören.
Klar hat VALUE insofern den Nachteil, das hier ggf. große Werte (mangls Platz) nicht übergeben werden können.
... der Hauptnachteil bei Value ist, dass SQL bei create function/procedure damit Probleme hat. RPG ist und bleibt eine Sammlung von workarounds gemäß der Bedeutung seiner Abkürzung: Raten Probieren Geht nicht
Ich denke, das Problem das du ansprichst, hat damit zu tun, dass die Summe der Variablen in einem RPG-Programm, einschließlich der Variablen in Prozeduren, 16MB nicht übersteigen darf.
Mittlerweile bietet das Teraspace-Konzept die Möglichkeit, über Pointer in einem Programm Speicher in Terabyte-Größen zu addressieren.
Auch die IBM API's nutzen Pointer zur Kommunikation z.B. das API iconv, mit dem man einen String von einer CCSID in eine andere konvertieren kann oder das API cvthc (convert character to hex).
Anbei zwei Programme, die mit Pointern kommunizieren. Performanceprobleme, wie bei der Übergabe von großen Variablen treten hier nicht auf. Das aufgerufe Programm ist bereits mit dem neuen allfree RPG geschrieben, das rufende ist noch old fashioned.
Das aufgerufene Programm entfernt einen ungültigen Hexcode aus einem String, der maximal 16MB groß ist.
Wichtig: Im Header muss alloc(*teraspace) angegeben werden, dann werden statt 8, 16 Byte große Pointer benutzt.
kleiner Tipp: große Variablen nicht mit *blanks initialisieren, sondern mit clear, das spart Performance.
Herzliche Grüße
Rainer Ross www.myhofi.com
schnelle und komfortable Hotelsuchmaschine mit Volltextsuche – powered by IBM i
Dann hast du Teraspace falsch verstanden.
Default ist jeder Pointer 16-Byte, nämlich als Pointer definiert. Mit Teraspace reduziert sich der Pointer auf 8 Byte und dann als Zahl, da Pointer vom MI-Typ her 16-Byte sind. Dies ist auch eher der C-Fraktion geschuldet.
Die 16-MB-Grenze galt nur für eine DS. Man kann also durchaus mehr als 16 MB verarzten.
Außerdem stehen %alloc()-Funktionen zur Verfügung um dynamischen Speicher zu ergattern (bis die Platte platzt).
Pointer lösen nicht das Problem sondern verschlimmern es sogar noch, da nicht mal der Compiler mehr die Typisierung prüfen kann (die zur Laufzeit sowieso nicht existent ist).
Bookmarks