[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    136

    Question Funktion mit variabler länge

    So würde ich das gerne machen, nur so funktioniert das leider nicht.
    Weiss jemande wie man das lösen könnte?
    PHP-Code:
    D UpperCase   B
    D UpperCase   PI     32766A options
    (*varsize// <-- das will er nicht
    D   string           32766A options(*varsize)
     
    D lower     C   Const('abcd...')
    D upper     C   Const('ABCD...')
     
     /
    free
     
      
    return %xlatelowerupperstring);
     
     /
    end-free
     
    D UpperCase   E 

  2. #2
    Registriert seit
    Dec 2003
    Beiträge
    106
    probiers mal damit

    D UpperCase B
    D UpperCase PI 32766A varying
    D string 32766A value varying

    D lower C Const('abcd...')
    D upper C Const('ABCD...')

    /free

    return %xlate( lower: upper: string);

    /end-free

    D UpperCase E

  3. #3
    Registriert seit
    Sep 2004
    Beiträge
    136
    Hab noch was herausgefunden, der Rückgabewert Funktioniert, nur der Input nicht, wenn ich die funktion z.B. so aufrufe: UpperCase('n'); steht in der Variablen "String" = 'n' und danach jede Menge Speichermüll und das ist das Problem.

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von Xanas
    Hab noch was herausgefunden, der Rückgabewert Funktioniert, nur der Input nicht, wenn ich die funktion z.B. so aufrufe: UpperCase('n'); steht in der Variablen "String" = 'n' und danach jede Menge Speichermüll und das ist das Problem.
    Diesen Speicher-Müll würde ich allerdings nicht überschreiben! Das gibt ganz böse Überraschungen.

    Ohne die Angabe der Schlüssel-Wörter CONST oder VALUE wird die Adresse des Parameter-Feldes an die aufgerufene Prozedur übergeben.

    Wird das Schlüssel-Wort VALUE verwendet, wird ein Duplikat des Parameter-Feldes mit der vom aufgerufenen Programm erwarteten Feld-Definition erstellt (vorausgesetzt die Datentypen sind compatibel, ansonsten ist die Kompilierung nicht erfolgreich). Dieses Duplikat wird an das aufgerufene Programm übergeben.

    Wird das Schlüssel-Wort CONST verwendet wird ein temporäres Feld mit der Definition des erwarteten Parameters erstellt und mit dem Parameter-Wert inititalisiert, sofern die Feld-Definitionen abweichen. Anschließend wird die Adresse des temporären Feldes an die aufgerufene Prozedur übergeben.
    Gibt es keine Abweichung wird die Adresse des Original-Feldes an die rufende Prozedur übergeben.

    Wird keines der beiden Schlüssel-Worte angegeben, wird die Adresse des Parameter-Feldes an die rufende Prozedur übergeben. Der Compiler vergleicht die Definition im Prototyp. Stimmt die Definition nicht überein, wird das Programm oder die Prozedur nicht erstellt, es sei den man gibt bei alphanumerischen Feldern das Schlüssel-Wort OPTION(*VARSIZE) an.

    Damit man keine bösen Überraschungen überlebt, muss man in der aufgerufenen Prozedur die Anzahl der übergebenen Byte abfragen und dafür sorgen, dass nur diese Anzahl Bytes verarbeitet wird. Ein CLEAR auf das Parameter-Feld in der aufgerufenen wird u.U. globalen Speicher überschreiben! (und an einer völlig anderen Stelle aufs Butter-Ende schlagen!)

    Um die Anzahl der übergebenen Bytes prüfen zu können, muss im Prototyp in der PR-Zeile das Schlüssel-Wort OpDesc angegeben werden. Dann kann durch den Aufruf des APIs CEEDOD die Anzahl der übergebenen Bytes pro Parameter ermittelt werden.

    Bei Feldern mit variablen Länge werden dem eigentlichen Feld 2 Byte vorangestellt in denen automatisch die Anzahl der verwendeten Bytes gespeichert wird. Diese beiden Byte werden vom Programm ausgelesen und nur die Anzahl der Byte verarbeitet, die in diesen beiden Byte gespeichert ist verarbeitet. Bei Feldern mit variabler Länge werden die folgenden Zeichen nicht durch Blanks oder x'00' oder was auch immer überschrieben.

    Der Rückgabe-Wert wird automatisch korrekt aufbereitet und zurückgegeben.

    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

  5. #5
    Registriert seit
    Sep 2004
    Beiträge
    136

    Talking

    Zitat Zitat von B.Hauser
    Um die Anzahl der übergebenen Bytes prüfen zu können, muss im Prototyp in der PR-Zeile das Schlüssel-Wort OpDesc angegeben werden. Dann kann durch den Aufruf des APIs CEEDOD die Anzahl der übergebenen Bytes pro Parameter ermittelt werden.
    Danke das hatte ich schon mal sogebaut, hatte aber auch nicht funktioniert, weil ich die Funktionsweise des API's nicht geschnallt hatte.

    Xanas

Similar Threads

  1. Länge Zeichenkette bei Barcode PDF417?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 13-11-06, 07:31
  2. Funktion in WRKACTJOB wiederherstellen
    By Marsman in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 27-09-06, 12:32
  3. sql funktion
    By steven_r in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 01-06-06, 12:16
  4. Bildschirmfeld variabler Länge
    By harkne in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 19-12-05, 17:46
  5. Zugriff auf Datei wo Keyfeld vom Typ variabler Länge
    By holly in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 07-12-04, 13:23

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •