[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2005
    Beiträge
    385

    Unhappy Problem mit Pointern und Procedure

    Hallo,

    ich habe ein PGM mit einer SubProcedure welche mir einen Pointer auf ein Array zurückgibt. Allerdings scheint der Speicherbereich des Arrays in der SubProcedure zerstört zu werden...

    Hier ein bißchen Code

    Code:
    d ArtikelArray    s             10A   dim(999)  based(pArtikelArray)             
    d pArtikelArray   S               *                                              
     *                                                                               
    d getArtikel      PR              *                                              
    d  Mat                           10A   value                                      
     *                                                                               
    C                   eval      pArtikelArray  = getArtikel('MATERIAL')             
     *                                                                               
    C                   EVAL      *inlr = *ON      
     **************************************************************************      
    P getArtikel      B                   export                                     
     *                                                                               
    D getArtikel      PI              *                                              
    D  Einsatz                      10A   value                                      
     *                                                                               
    d arrEins         S             10A   dim(999)                                   
    d ax              S              3S 0 inz(0)                   
     *                                                             
    d arrArtikel      S             10A   dim(999) inz(*HIVAL)     
     *                                                             
    d bx              S              3S 0 inz(0)                   
    d parrArtikel     S               *                            
    d i               S              3S 0 inz(0)                   
     *                                                             
      .... arbeiten
    C                   EVAL      parrArtikel =%ADDR(arrArtikel)       
     *                                                                 
    C                   return    parrArtikel                          
     *                                                                 
    P getArtikel      E
    Beim return in der SubProcedure ist das Array arrArtikel sauber gefüllt. Beim *INLR in der Mainline ist das Array ArrayArtikel in einigen Elementen nicht mehr in Ordnung? Es stehen seltsame Sonderzeichen drin.

    Wo ist der Fehler?

    Danke an allen Helfenden!

  2. #2
    Registriert seit
    Jan 2003
    Beiträge
    746
    In solchen Fällen würde ich mit Pi (Entry Parm) = 0 oder *Off arbeiten und so jeden Aufruf mit Return verlassen. Am Ende des aufrufenden Programmes dann ein extra call mit Pi = *On - um das Ding aus dem HSP zu entfernen...

  3. #3
    Registriert seit
    Nov 2003
    Beiträge
    2.306
    Was willst du mit dem Inhalt einer lokalen Variable außerhalb ihrer Prozedur?

    Storage of Definitions

    Local definitions use automatic storage. Automatic storage is storage that exists only for the duration of the call to the procedure. Variables in automatic storage do not save their values across calls.

    Global definitions, on the other hand, use static storage. Static storage is storage that has a constant location in memory for all calls of a program or procedure. It keeps its value across calls.

    Specify the STATIC keyword to indicate that a local field definition use static storage, in which case it will keep its value on each call to the procedure. If the keyword STATIC is specified, the item will be initialized at module initialization time. [...]

    Quelle

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Dies ist soweit korrekt.
    Eine Funktion/Prozedur kann keine Werte auf temporären Speicher zurückgeben.
    Allerdings kannst das Array als Ergebnis zurückgeben, was hier aber ggf. keinen Sinn macht da du mit dem globalen Array (ohne "based") arbeiten kannst.
    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 2014
    Beiträge
    179
    Hallo Forum,

    ich arbeite sehr gerne mit Pointern und free RPG und habe zwei Ideen zum obigen Programm.

    - im Header arbeite ich mit der Option *teraspace.
    - es wäre auch möglich, das ArtikelArray als Adresse an die Prozedur zu übergeben

    Herzliche Grüße

    Rainer



    PHP-Code:
             ctl-opt dftactgrp(*noalloc(*teraspaceoption(*nounref);

             
    dcl-pr getArtikel;
                     
    Mat              char(10) const;
                     
    Array_p          pointer  const;
             
    end-pr;

             
    dcl-s   ArtikelArray     char(10dim(999);

               
    getArtikel('MATERIAL':%addr(ArtikelArray));

               *
    inlr = *on;
          
    //------------------------------------------------------------------//
          // Procedure - getArtikel                                           //
          //------------------------------------------------------------------//
             
    dcl-proc getArtikel export;
             
    dcl-pi *n;
                     
    ##Einsatz   char(10)     const;
                     ##array_p   pointer      const;
             
    end-pi;

             
    dcl-s   arrArtikel  like(ArtikelArraybased(##array_p);

             
    dcl-s   arrEins     char(10dim(999inz(*hival);
             
    dcl-s   ax          uns(10inz(0);

             
    end-proc;
          
    //------------------------------------------------------------------// 

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Ich kann aber auch dann keinen Pointer auf temporären Speicher zurückgeben, da der Inhalt mit jedem neuen Call-Entry (auch z.B. BuiltIn-Funktionen) überschrieben wird.
    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

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Nur mal so eine Frage:
    Werden das Programm und die Prozedur in der gleichen Aktivierungsgruppe ausgeführt?

    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Das ist nicht relevant. Klar ist ja wohl, dass bei der Übergabe eines statischen Speichers über 2 Aktivierungsgruppen natürlich beide noch aktiv sein müssen.
    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

  9. #9
    Registriert seit
    Apr 2005
    Beiträge
    385
    Es scheint so zu sein, wie von Fuerchau beschrieben: Lokaler Speicher wird beim verlassen der Procedure andersweitig verwendet.
    Ich dachte es ist eib bisschen wie JAVA, solange eine Referenz vorhanden ist, bleibt der Speicher reserviert. Naja, dann mach ich es halt anders. (Lokale Variable in globale Variable umgeändert...)

    Trotzdem Danke an alle Helfenden....

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Mit Java kann man das nicht vergleichen, denn es gibt da keine Unterscheidung zwischen statischem und temporären Speicher.
    Hier ist der sog. Scope für die Existenz wichtig. Außerdem kann man in Java keine Pointer zurückgeben sondern nur Klassen und Einzeltypen (Double, Int, ...). Bereits der String ist eine Klasse mit Speicher aus dem Heap.
    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
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Außerdem kann man in Java keine Pointer zurückgeben sondern nur Klassen und Einzeltypen (Double, Int, ...). Bereits der String ist eine Klasse mit Speicher aus dem Heap.
    In Java übergibst du Objekte und primitive Datentypen (int, long, char, ...)
    Objekte sind Instanzen von Klassen und befinden sich im Heap und es wird nur die Speicheradresse (Pointer) übergeben.

    Und du könntest folgendes schreiben:
    Code:
    public Object getObject() {...}
    Da ja alle Klassen von der Klasse Object erben, musst du hier die Klasse vom zurückgegebenen Objekt prüfen.

    In PHP z.B. werden auch immer Pointer bei Parametern übergeben. Erst wenn der Wert sich ändert, wird eine Kopie vom Objekt mit einer neuen Adresse erstellt. Dadurch wirkt es von außen, als würde der Wert statt des Pointers übergeben werden.
    Wenn ich das "&" beim Parameter dazuschreibe definiere ich damit, dass auch beim Ändern das gleiche Objekt verwendet werden soll.

    Also es gibt sehr wohl ähnlichkeiten, jedoch kann das Speicherverhalten von jeder Programiersprache unterscheiden.

Similar Threads

  1. Return aus SQL Procedure
    By dabeda in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 05-03-15, 12:53
  2. Problem SQL Procedure
    By CaddyMajor in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 25-06-14, 08:22
  3. Stored Procedure endlos
    By lorenzen in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 12-12-02, 16:46
  4. Java stored procedure
    By Sven Schneider in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 03-09-02, 07:31
  5. Stored Procedure
    By lorenzen in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 27-08-02, 14:59

Berechtigungen

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