Referenz => FREED STACK

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Referenz => FREED STACK

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Moin,

gegeben sei folgendes Programm:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZZRW_FREED_STACK_DEMO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zzrw_freed_stack_demo.

**********************************************************************
*
**********************************************************************
CLASS lcl_freed_stack_demo DEFINITION.

  PUBLIC SECTION.

    METHODS:
      "! Datenselektion -- diese Methode ist so natürlich nicht
      "! sinnvoll. In Wahrheit kommt die Tabelle aus einer externen
      "! Quelle und ich kenne deren Struktur nicht, darum schiebe
      "! ich das Ergebnis der Selektion in eine Datenreferenz,
      "! um dann später den Typ zu ermitteln und die Tabelle
      "! entsprechend auszuwerten.
      "!
      "! Die Methode zeigt halt den Fehler ganz gut, den ich nicht
      "! verstehe....
      data_sel
        RETURNING
          VALUE(data_ref) TYPE REF TO data.

ENDCLASS.

DATA:
  data_ref_caller TYPE REF TO data.

" BÄMM!
data_ref_caller = NEW lcl_freed_stack_demo( )->data_sel( ).
BREAK-POINT.

**********************************************************************
*
**********************************************************************
CLASS lcl_freed_stack_demo IMPLEMENTATION.

  METHOD data_sel.

    DATA:
      data_table TYPE STANDARD TABLE OF sflight.

    SELECT * FROM sflight
    INTO TABLE data_table
    UP TO 20 ROWS.

    GET REFERENCE OF data_table INTO data_ref.
  ENDMETHOD.

ENDCLASS.
Wenn man das Programm startet und es im Debugger anhält, erhält man die Variablenanzeige FREED STACK.

Das hängt irgendwie damit zusammen, dass data_table eine lokale Variable ist und nach Verlassen der Methode nicht mehr existiert. So wirklich genau habe ich das nicht verstanden - insbesondere habe ich nicht verstanden, wie ich das Problem löse. Ich habe schon x-mal Referenzen benutzt und manchmal taucht halt dieses Problem auf -- wobei ich nicht reproduzieren kann, wann es funktioniert und wann ich das Problem bekomme.

Nehme ich eine Instanzvariable statt data_table, kriege ich den FREED STACK nicht, aber beim Zugriff auf die Referenz per CL_ABAP_TABLEDESCR=>DESCRIBE_BY_DATA_REF erhalte ich den Dump SYSTEM_DATA_ALREADY_FREE - Der Zugriff auf bereits freigegebene Daten ist nicht erlaubt.


Ralf

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
tm987456

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Referenz => FREED STACK

Beitrag von a-dead-trousers (Top Expert / 4286 / 214 / 1142 ) »
Du musst mit CREATE DATA arbeiten, damit die Daten im HEAP und nicht im STACK abgelegt werden.

Code: Alles auswählen.

CREATE DATA data_ref TYPE sflight_tab.

FIELD-SYMBOLS: <data_table> TYPE sflight_tab. "<-- Damit es ein Tabellentyp für das SELECT ist.

ASSIGN data_ref->* TO <data_table>.
  
SELECT * FROM sflight
    INTO TABLE <data_table>
    UP TO 20 ROWS.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 2):
ralf.wenzeltm987456

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Referenz => FREED STACK

Beitrag von tm987456 (ForumUser / 72 / 42 / 14 ) »
Jetzt hab ich eine Stunde mit type ref to data und REF #( ) experimentiert, bin in Freed ITAB reingeflaufen, was ich mit a-d-ts Posting gut lösen konnte, nur um am Ende festzustellen, dass für meinen Fall eine Stringtabelle viel besser passt.

Aber interessant war es =)

Re: Referenz => FREED STACK

Beitrag von gtoXX (Specialist / 185 / 34 / 31 ) »
Die Beschreibung von ADT löst das Problem für Fall nicht, gilt aber für den Abruf.

METHOD data_sel.
DATA:
data_table TYPE STANDARD TABLE OF sflight.


Deine Variable wird schlicht lokal in der Methode erzeugt. Damit ist ihre Lifetime wie bei lokalen Variablen in Forms.

Du musst sie als Klassenattribut deklarieren. So lange das Objekt lebt, kannst du die Daten auch verwenden.

data_ref muss übrigens nicht typisiert werden. Du kannst 1 Data-Ref Variable für n-Referenzen verwenden. Es genügt wenn das Feldsymbol typsiert ist um den strutkurierten Typ benutzen zu können.

Theoretisch kann das Feldsymbol solange generisch bleiben, bis du den konkreten Typ brauchst. Ich habe so was mal für eine Filekonverter gemacht. Dadurch ist mein Upload-Interface immer gleich. Nur an einer konkreten Stelle wurde der passende "Filter" angewendet um die Daten in internes Format umzuwandeln. Natürlich muss das rufende Programm dann wissen, was es erwartet.

Ergänzend : Wenn data_ref typsiert ist, erlaubt SAP an Einigen Stellen auch den direkten Zugriff, also data_ref->*-Feld1. Ein Fieldsymbol wird dadurch überflüssig. Leider haben sie es noch nicht überall so.

Man kann sich so z.b. einen Setter sparen ( auch wenn ich das wegen der Klarheit nicht bevorzuge ), in dem Du einen Getter hast, der immer REF TO liefert. Somit kannst du in deiner Klasse über get()->*->Feld1 den Feldwert direkt setzen.
"Code lügt nicht ^^"

Seite 1 von 1

Vergleichbare Themen

3
Antw.
3122
Views
Referenz-Tabelle UND Referenz-Feld f.BRGEW und NTGEW
von bohne » 22.02.2007 10:52 • Verfasst in ABAP® für Anfänger
2
Antw.
6102
Views
Referenz-Tabelle und Referenz-Feld
von dyv » 28.08.2014 15:25 • Verfasst in ABAP® für Anfänger
6
Antw.
5510
Views
Dynpro Stack?
von mawi » 23.08.2007 08:37 • Verfasst in Dialogprogrammierung
1
Antw.
1574
Views
Java Stack nachträglich deinstallieren
von este0037 » 07.04.2008 16:26 • Verfasst in Basis
1
Antw.
1732
Views
Nachinstallation von Java Stack bei NW 2004s
von blinkie » 31.01.2008 07:23 • Verfasst in Basis

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.