-
ILE RPG (varying / varsize)
Hallo !
was ist denn da genau der Unterschied ?
-
-
Ganz kurz gesagt, das eine benutzt man bei der Variablendefinition das andere bei der Interfache-Parameterdefinition.
-
Da seit ihr aber sowas von falsch!
VARYING definiert eine Variable mit fester Größe zzgl. einer Längeninformation vor der Variable, die die Länge des Inhaltes beschreibt.
D MyVar 100 varying
Belegt 102 Zeichen im Speicher mit einer 2-Byte-Ganzzahl für den Inhalt.
D MyVar 100000 varying(4)
belegt 100004 Zeichen mit einer 4-Byte-Länge (ab 64KB erforderlich).
OPTIONS(*VARSIZE) bedeutet bei Parametern, dass unterschiedliche lange Felder an den Parameter übergeben werden können.
Dies enthebt den Programmierer aber nicht davon, die Längeninformation trotzdem mitzugeben.
Häufig findet man das bei API's, in denen man eine Länge und eine Variable übergibt. Durch diese Option benötigt man allerdings keine eigene Variable mehr.
Durch CONST wird allerdings sowieso eine Kopie der Variable in der definierten Länge erstellt.
Die Kombination "varying options(*varsize)" ist ebenso möglich.
-
Zitat von Fuerchau
Da seit ihr aber sowas von falsch!
Ich frage mich immer wieder warum hier manche so einen Konkurrenzkampf betreiben müssen, dass Beiträge von anderen gleich als sooooo falsch abgestempelt werden müssen obwohl vielleicht nur eine Kleinigkeit nicht ganz 100% passt?!?
-
Zunindest die Frage selbst und der "Erster Treffer bei Google" (von IBM selbst) waren ja so falsch jetzt nicht.
-
Zitat von Fuerchau
Durch CONST wird allerdings sowieso eine Kopie der Variable in der definierten Länge erstellt.
Nur der Vollständigkeit halber: Ich glaube nicht, dass durch CONST eine Kopie der Variablen angelegt wird. Ich glaube, dass hier auch ein "Call by Reference" erfolgt, also ein Pointer auf die Original-Variable übergeben wird. Allerdings stellt der Compiler bei CONST sicher, dass die Variable im Source nicht verändert wird.
Wenn man eine Kopie der Variablen haben möchte, müsste man das Schlüsselwort "values" verwenden, denke ich.
(Wie der Compiler bei Const absichert, dass man nur auf die übergebene Länge zugreift, ist mir allerdings nicht ganz klar.)
Dieter
-
Bei Schlüssel-Wort CONST wird dann eine Hilfs-Variable mit dem erwarteten Datentyp und der erwarteten Länge erstellt, wenn die übergebne Variable von der Definition des Prototypen abweicht.
An die aufgerufene Prozedur wird allerdings nicht die (Hilfs-)Variable, sondern lediglich die Adresse der Hilfs-Variable übergeben.
Da aus diesem Grund in der aufgerufenen Prozedur nie sicher ist, ob auf eine Kopie oder die Original-Daten zugegriffen wird, dürfen mit CONST übergebene Variablen in den aufgerufenen Prozeduren nie geändert werden (Compile-Fehler)
Es gab tatsächlich (vor urdenklichen Zeiten) einen Bug, dass auch Original-Felder z.B. durch CLEAR überklatscht werden können. Dieser Bug ist jedoch bereits seit einigen Releasen behoben.
Die Option VARSIZE ist nur für Ein/Ausgabe oder reine Ausgabe-Parameter interessant. Da an dieser Stelle wirklich nur der Pointer zurückgegeben wird. In der aufgerufenen Prozedur dürfen nur die entweder in einem Längen-Parameter übergebenen Bytes oder über die Prozedur CEEDOD (in Verbindung mit dem Schlüssel-Wort OPDESC) ermittelten Bytes geändert werden.
Die Gefahr, dass z.B. bei inkorrekt berechneten Länge globaler Speicher überschrieben wird, ist sehr groß und solche Fehler dann zu finden ziemlich schwierig.
Ansonsten finde ich es auch nicht ganz fäir Antworten von anderen als "sooo falsch" zu betiteln. Nobody is perfect und nicht alles was man sich selber zusammenreimt ist korrekt.
Birgitta
-
Bei Schlüssel-Wort CONST wird dann eine Hilfs-Variable mit dem erwarteten Datentyp und der erwarteten Länge erstellt, wenn die übergebne Variable von der Definition des Prototypen abweicht.
An die aufgerufene Prozedur wird allerdings nicht die (Hilfs-)Variable, sondern lediglich die Adresse der Hilfs-Variable übergeben.
Da aus diesem Grund in der aufgerufenen Prozedur nie sicher ist, ob auf eine Kopie oder die Original-Daten zugegriffen wird, dürfen mit CONST übergebene Variablen in den aufgerufenen Prozeduren nie geändert werden (Compile-Fehler)
Es gab tatsächlich (vor urdenklichen Zeiten) einen Bug, dass auch Original-Felder z.B. durch CLEAR überklatscht werden können. Dieser Bug ist jedoch bereits seit einigen Releasen behoben.
Die Option VARSIZE ist nur für Ein/Ausgabe oder reine Ausgabe-Parameter interessant. Da an dieser Stelle wirklich nur der Pointer zurückgegeben wird. In der aufgerufenen Prozedur dürfen nur die entweder in einem Längen-Parameter übergebenen Bytes oder über die Prozedur CEEDOD (in Verbindung mit dem Schlüssel-Wort OPDESC) ermittelten Bytes geändert werden.
Die Gefahr, dass z.B. bei inkorrekt berechneten Länge globaler Speicher überschrieben wird, ist sehr groß und solche Fehler dann zu finden ziemlich schwierig.
Ansonsten finde ich es auch nicht ganz fäir Antworten von anderen als "sooo falsch" zu betiteln. Nobody is perfect und nicht alles was man sich selber zusammenreimt ist korrekt.
Birgitta
-
Wie Birgitta schon geschrieben hat (nur eben im Detail) erzeugt CONST eben eine temporäre Variable in der definierten Länge und kopiert bei Aufruf den angegeben Parameter da hinein.
Die Übergabe erfolgt dann per Reference.
Die Angabe von VARSIZE ist bei Const nur Dokumentation und unnötig.
Die Definition CONST und VALUE sind bei RPGLE ziemlich gleichbedeutend.
In beiden Fällen wird mit einer Kopie gearbeitet. Einzig die interne Übergabe erfolgt etwas anders.
Bei Prozeduren können VALUE-Werte direkt übergeben werden wärend bei CONST wiederum nur die Adresse, also die Referenz auf die Kopie übergeben wird.
Bei externen Programmen kann VALUE nicht angegeben werden, da hier grundsätzlich per Referenz übergeben werden muss.
Noch mal zurück zu VARSIZE.
Übergibt man per Referenz eine Variable, muss ohne VARSIZE immer die Variable entsprechend der Deklaration definiert werden.
Gibt man VARSIZE an, wird nun jede Variable mit Ihrer Adresse akzeptiert (sogar Konstanten), so dass das gerufene Programm auf alles mögliche Zugreifen kann.
Und was das "so falsch" angeht, so mag der Ton falsch angekommen sein, die Aussage ist aber trotzdem korrekt. Ich entschuldige mich bei allen, die das falsch aufgenommen haben.
Wenn ihr euch die Definition von VARSIZE und VARYING mal genau anseht, so kann man das eine mit dem anderen wirklich nicht ersetzen oder austauschen.
Dies betraf allerdings nur diese Aussage:
"Ganz kurz gesagt, das eine benutzt man bei der Variablendefinition das andere bei der Interfache-Parameterdefinition."
Wenn ich eine VARYING-Variable an eine Prozedur mit VARSIZE ohne CONST übergebe, wird die Adresse des Längenattributes und nicht die Adresse des Inhaltes übergeben.
Mit CONST wird eine Kopie ohne Längenattribut in voller Länge übergeben.
Der Compiler sichert überhaupt nichts ab sondern versucht nur die Definitionen zu überprüfen und bei Abweichungen eben abzulehnen. Wenn die Definitionen der beiden betroffenen Komponenten nicht übereinstimmen kommt es häufig genug zu Laufzeitfehlern, die allerdings durchaus auch verspätet aufschlagen. Eine Runtime-Prüfung auf unterschiedlich definierte Schnittstellen erfolgt generell nicht.
-
... aus dem Watschen verteilen halte ich mal (ausnahmsweise) raus.
Zu dem Const hab ich ernsthafte Einwände: CONST ist nciht ziemlich dasselbe wie VALUE
- CONST müsste eher "Hopefully CONST" heißen, da das ganze Konstrukt darauf vertraut, dass die Verwendung von Prototypen konsistent erfolgt. Mit einem falschen Prototyp im aufgerufenen (!!!) Programm lässt sich das unterlaufen und kommt im aufrufenden dann als Änderung an. Dass da (angeblich) bei abweichenden Prototypen Referenzen auf Kopien weitergegeben werden ist logisch nicht schlüssig - die Kopien müssten im aufrufenden Programm gemacht werden und das kann nicht wissen, ob da jemand einen abweichenden Prototyp verwendet.
- VALUE wird von externen stored Procedures nicht unterstützt.
=> es bleibt bei RPG wieder einmal die Wahl zwischen Pest und Cholera:
- verwende ich CONST, vertraue ich darauf, dass kein anderer Mist macht
- verwende ich VALUE, brauche ich einen zusätzlichen Wrapper, wenn ich eine vorhandene Funktion als SQL-Procedure oder -Function bereit stellen will.
D*B
Similar Threads
-
By Robi in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 11-08-01, 13:16
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