-
 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