[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2015
    Beiträge
    336

    ILE RPG (varying / varsize)

    Hallo !

    was ist denn da genau der Unterschied ?

  2. #2
    Registriert seit
    Apr 2005
    Beiträge
    385

  3. #3
    Registriert seit
    Apr 2005
    Beiträge
    385
    Ganz kurz gesagt, das eine benutzt man bei der Variablendefinition das andere bei der Interfache-Parameterdefinition.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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?!?

  6. #6
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Zunindest die Frage selbst und der "Erster Treffer bei Google" (von IBM selbst) waren ja so falsch jetzt nicht.

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Option(*varsize)
    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
  •