[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Nov 2007
    Beiträge
    79

    Dynamische Speicherzuweisung für Feldgruppen

    Hallo!

    ich beschäftige mich gerade mit dem Thema den Speicher für eine Feldgruppe zur Laufzeit des Programms dynamisch festzulegen.

    Ich habe mir dazu ein kurzes Programm geschrieben, um das Ganze mal zu testen. Das Programm läuft einwandfrei (auch wenn der Quellcode sicher optimiert werden könnte).

    Ich habe also den Speicher zugewiesen und in das Array geschrieben. Funktioniert soweit alles gut. Nun wollte ich die Gegenprobe als Beweis machen und habe keinen Speicher zugewiesen und dann in das Array geschrieben. Im Debug konnte ich sehen, dass die Werte im Array vorhanden sind. Auch gab es keine Meldung im Joblog.

    Mich interessiert, ob es eine Methode gibt, um zu prüfen, dass alles so funktioniert wie ich es mir denke. Kann ich irgendwie die Speicherzuweisung bzw. -nutzung verfolgen oder das System zu einem Fehler "zwingen"?

    Unten findet ihr das funktionierende Programm.


    Danke und Gruß
    Matthias


    PHP-Code:
         D Arrayptr        S               *   Inz(*Null)
         
    D cArray          DS                  Based(Arrayptr)
         
    D  aArray                             dim(1000)
         
    D   aField1                     10    overlay(aArray)
         
    D Value           S             10A   INZ('Test01')
         
    D X               S             10P 0 INZ(1)
         
    D Y               S             10P 0


          
    /Free
           
    // Allocate memory X + 10 elements
           
    10;
           
    Arrayptr = %Alloc(%Size(cArray) * Y);


           
    DOU X 100;
           IF 
    Y;
           
    // Fill array and increase counter
           
    aField1(X) = Value;
           
    1;
           ENDIF;

           IF 
    Y;
           
    // Increase allocated memory
           
    10;
           
    Arrayptr = %Realloc(Arrayptr: %Size(cArray) * Y);
           
    // Fill array and increase counter
           
    aField1(X) = Value;
           
    1;
           ENDIF;
           
    ENDDO;

           *
    INLR = *ON;

          /
    End-Free 

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Dass es keinen Fehler gibt beim Zugriff auf Daten mit einem NULL-Pointer kann ich kaum glauben. Normalerweise gibts da einen MCH-Fehler (Adresse nicht gesetzt).

    Wenn du zu wenig Speicher zuordnest und dann auf Speicher dahinter zugreifst merkt das System das ggf. nicht solange der intern zugewiesene Speicher ausreicht.
    Der Programmierer ist da vollkommen auf sich selbst gestellt.

    Durch Adress-Arithmetik kann man beliebige Speicheradressen berechnen. Solange diese zugriffsberechtigt sind, gibts keinerlei Probleme.
    Man kommt sogar an Systembereiche und fremde Job's (z.B. fremde QTEMP's) und kann ggf. auch modifizieren bis zum Systemabsturz (und zwar gewaltig).

    Ich hatte da ganz früher mal ein Testprogramm geschrieben, was anschließend zur Neuinstallation des Systems zwang, da ich einen Systemzeiger verbogen hatte und kein einziges CMD mehr gestartet werden konnte.
    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

  3. #3
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Du solltest zumindest abfragen, ob %ALLOC und %REALLOC erfolgreich waren.

  4. #4
    Registriert seit
    Nov 2007
    Beiträge
    79
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Dass es keinen Fehler gibt beim Zugriff auf Daten mit einem NULL-Pointer kann ich kaum glauben. Normalerweise gibts da einen MCH-Fehler (Adresse nicht gesetzt).

    Wenn du zu wenig Speicher zuordnest und dann auf Speicher dahinter zugreifst merkt das System das ggf. nicht solange der intern zugewiesene Speicher ausreicht.
    Der Programmierer ist da vollkommen auf sich selbst gestellt.
    ok, den Fehler gab es sicher nicht. Also muss ich irgendwas falsch gemacht haben.

    Könntest du vielleicht anhand meines Programms erklären, was ich ändern muss, um den Fehler zu bekommen?


    Du solltest zumindest abfragen, ob %ALLOC und %REALLOC erfolgreich waren.
    Das werde ich natürlich später tun und dann auch entsprechend darauf reagieren. Ich wollte einfach in einem kurzen Programm sehen, wie sich diese Methode verhält und ob ich sie in andere Programme einbauen kann.

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Also das wirft hier unter V5R4 einen MCH3601 (Zeiger für angegebene Position nicht gesetzt.) gefolgt von einem RNQ0222 (Zeiger- oder Parameterfehler).

    PHP-Code:
    D Arrayptr        S               *   Inz(*Null)     
    D cArray          DS                  Based(Arrayptr)
    D  aArray                             dim(1000)      
    D   aField1                     10    overlay(aArray)
    D Value           S             10A   INZ('Test01')  
    D X               S             10P 0 INZ(1)         
    D Y               S             10P 0                
                                                         
     
    /Free                                               
      aField1
    (X) = Value;                                
      *
    INLR = *ON;                                       
     /
    End-Free 

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... hier muss man (mindestens) 2 Dinge voneinander unterscheiden:

    Eine Variable mit based Deklaration wird vom Compiler ohne Speicher angelegt, wenn dem based Pointer zur Compiletime kein statischer Wert zugewiesen werden kann. Wird sowas dann zur Laufzeit referenziert, merkt die runtime das, und motzt.

    Habe ich dem based Pointer einen Wert zugewiesen (über alloc, %addr, oder sowas) kann ich die Variable bedienen. Dynamische Speicher Allokierung ist keine (in Worten: k e i n e !) Stärke der RPG Runtime Umgebungen, so ein Pointer auf der AS/400 weiß nicht auf was er da zeigt und das ist ihm auch Wurscht. Die entsprechenden Prüfungen sind lückenhaft, wie ein Käse, als man den Kühen noch keine Antibiotika gab. Adressiere ich Phantasiewerte für den Pointer, durch Rechenfehler, Verwendung von mehr Elementen des Arrays als es hat... könnte es knallen, muss aber nicht, wenn man Pech hat, dann überklopft ein neuer alloc möglicherweise irgendwas und wenn da dann ein anderer Pointer stand, dann gehts richtig in den Wald - auf Windows nennt man das dann Bluescreen, auf AS/400 WebSphere.

    Aufpassen muss man natürlich zusätzlich noch an anderen Stellen, wie Pointer Alignment, korrekte Freigabe von Speicher etc. - es sei denn, man verwendet eine fertige Komponente, da gibt es auf meiner Freeware Seite eine HashTable und einen Vector, bei Mihael (RPGNEXTGEN.COM) einen Vector, eine linked list und weiteres, Thomas (tools400.de) hat sowas wahrscheinlich auch Open Source und Google findet wohl noch mehr.

    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/

  7. #7
    Registriert seit
    Nov 2007
    Beiträge
    79
    Hallo,

    ich bekomme den gleichen Fehler, wenn ich dein Beispiel nutze.

    Dann habe ich wohl einen Gedankenfehler in meinem Programm.

    Kann es sein, dass diese Anweisungen mehr Speicher zuweisen, als ich erwarte (X+10 = 11 Elemente)?

    PHP-Code:
    // Allocate memory X + 10 elements
    10;
    Arrayptr = %Alloc(%Size(cArray) * Y); 

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Klar, du weist ja nicht die Größe der einzelnen Elemente zu sondern die definierte Größe deiner gesamten DS, und das N-Mal.
    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
    Nov 2007
    Beiträge
    79
    In Ordnung, ich habe ein Feld mit der Länge 10 in meinem Array.

    Also müsste ich wenn ich 11 Elemente zuweise Platz für 110 Zeichen haben, oder nicht?

    Wo liegt mein Irrtum?

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    11 * 10.000 = 110.000

    lass das lieber mit der Pointer Rechnerei!

    D*B

    Zitat Zitat von Matthias182 Beitrag anzeigen
    In Ordnung, ich habe ein Feld mit der Länge 10 in meinem Array.

    Also müsste ich wenn ich 11 Elemente zuweise Platz für 110 Zeichen haben, oder nicht?

    Wo liegt mein Irrtum?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    cArray ist eine Struktur mit 1000 Elementen von aArray, also 10.000 lang.
    %size(cArray) liefert daher 10.000
    %size(aArray) liefert 10.
    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

  12. #12
    Registriert seit
    Nov 2007
    Beiträge
    79
    Zitat Zitat von BenderD Beitrag anzeigen
    11 * 10.000 = 110.000

    lass das lieber mit der Pointer Rechnerei!

    D*B
    Na ja, wenn man sich nicht mit Themen auseinander setzt, dann wird man sie auch nicht verstehen.

    Also nochmal, die Berechnung ist also:

    Länge Feld (10) x Elemente Array (1000) x 11 = 110 000

    Das bedeutet aber, dass ich automatisch mehr Speicher zugewiesen habe, als das Array Elemente aufnehmen kann. Stimmt das soweit?

    Die Frage ist nun, wie schaffe ich es denn dann, weniger Speicher zuzuweisen? Wenn die Anzahl Elemnte immer eine Rolle spielt ist das aus meiner Sicht so nicht möglich.

Similar Threads

  1. dynamische Satzauswahl / Rumba vs. CA
    By y-richy in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 10-08-06, 13:59
  2. Dynamische Bar Codes
    By Xanas in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 23-05-06, 13:09
  3. embedded SQL / dynamische SET-Anweisung
    By Stannek in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 04-04-06, 08:16
  4. Dynamische Abfragen in RPG
    By marcel331 in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 18-01-06, 09:35
  5. Dynamische Logische Datei
    By dd3tj in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 20-01-05, 14:55

Berechtigungen

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