Skip to Content
0
Jun 04, 2008 at 06:34 AM

Probles on data reference/field-symbols and FREED STACK on OOP program

1095 Views

Hi Guru,

I have develop a class on my program and I am confused by some problem on data reference and field-symbols.

Below is my Example program cods:

Main program for calling Class

*&---------------------------------------------------------------------*
*& Report  ZTESTING
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ztesting.
DATA: BEGIN OF ls_line,
      fielda TYPE c,
      fieldb TYPE c,
      END OF ls_line.
DATA: itab LIKE STANDARD TABLE OF ls_line.
DATA: ref TYPE REF TO data.
DATA: o_instance TYPE REF TO ztest_cl.
FIELD-SYMBOLS: <ft> TYPE STANDARD TABLE.

START-OF-SELECTION.
  ls_line-fielda = 'C'.
  ls_line-fielda = 'D'.
  APPEND ls_line TO itab.

  CREATE OBJECT o_instance
         EXPORTING
            i_condition = 'U'.
  CALL METHOD o_instance->get_reference
    EXPORTING
      itab   = itab
    IMPORTING
      ip_ref = ref.
*  ASSIGN ref->* TO <ft>.
*  CLEAR <ft>.
  CALL METHOD o_instance->clear_data
    CHANGING
      cp_ref = ref.
  break chengr.

Cods of Class - ZTEST_CL

Private Section of Class

*"* private components of class ZTEST_CL
*"* do not include other source files here!!!
PRIVATE SECTION.

TYPES:
  BEGIN OF type_line_l,
       field1(1) TYPE c,
       field2(1) TYPE c,
       END OF type_line_l .
TYPES:
  type_itab_l TYPE STANDARD TABLE OF type_line_l .
TYPES:
  BEGIN OF type_line_u,
       field1(1) TYPE c,
       field2(1) TYPE c,
       END OF type_line_u .
TYPES:
  type_itab_u TYPE STANDARD TABLE OF type_line_u .

DATA line_u TYPE type_line_u .
DATA line_l TYPE type_line_l .
DATA itab_u TYPE type_itab_u .
DATA itab_l TYPE type_itab_l .
DATA itab_ref TYPE REF TO data .

METHODS clear_internal_data .

Public Section of Class

*---------------------------------------------------------------------*
*       CLASS ZTEST_CL  DEFINITIO
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS ztest_cl DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

*"* public components of class ZTEST_CL
*"* do not include other source files here!!!
PUBLIC SECTION.

  METHODS constructor
    IMPORTING
      !i_condition TYPE c .
  METHODS get_reference
    IMPORTING
      !itab TYPE STANDARD TABLE
    EXPORTING
      !ip_ref TYPE REF TO data .
  METHODS clear_external_data
    CHANGING
      !cp_ref TYPE REF TO data .
  METHODS clear_data
    CHANGING
      !cp_ref TYPE REF TO data .

Codes of Constructor

METHOD constructor.
***********Importing parameters:
***************I_CONDITION	TYPE C	

  line_u-field1 = 'A'.
  line_u-field2 = 'B'.
  APPEND line_u TO itab_u.

  line_u-field1 = 'X'.
  line_u-field2 = 'Y'.
  APPEND line_u TO itab_u.

  line_l-field1 = 'a'.
  line_l-field2 = 'b'.
  APPEND line_l TO itab_l.

  line_l-field1 = 'a'.
  line_l-field2 = 'b'.
  APPEND line_l TO itab_l.

  CASE i_condition.
    WHEN 'U'.
********Upper Case
*      GET REFERENCE OF itab_u INTO itab_ref.
      CALL METHOD me->get_reference
        EXPORTING
          itab   = itab_u
        IMPORTING
          ip_ref = itab_ref.
    WHEN 'L'.
*********Low Case
*      GET REFERENCE OF itab_l INTO itab_ref.
      CALL METHOD me->get_reference
        EXPORTING
          itab   = itab_l
        IMPORTING
          ip_ref = itab_ref.
  ENDCASE.
ENDMETHOD.                    "constructor

Codes of Method Get_reference

METHOD get_reference.
***********Importing parameters
*************ITAB	TYPE STANDARD TABLE
***********Exporting parameters
**************IP_REF	TYPE REF TO DATA
  GET REFERENCE OF itab INTO ip_ref.
ENDMETHOD.

Codes of Method clear_external_data

METHOD clear_external_data.
*************Changing Parameter
*****************CP_REF	TYPE REF TO DATA	
  FIELD-SYMBOLS: <ft> TYPE STANDARD TABLE.
  ASSIGN cp_ref->* TO <ft>.
*  CHECK sy-subrc EQ 0.
  CLEAR <ft>.
ENDMETHOD.

Codes of Method clear_data

METHOD clear_data.
*************Changing Parameter
*****************CP_REF	TYPE REF TO DATA	
  CALL METHOD me->clear_internal_data.
  CALL METHOD me->clear_external_data
    CHANGING
      cp_ref = cp_ref.
ENDMETHOD.

Codes of Method clear_internal_data

METHOD clear_internal_data .
****************Import parameters
****************Export parameters
  FIELD-SYMBOLS: <ft> TYPE STANDARD TABLE.
  ASSIGN itab_ref->* TO <ft>.
*  CHECK sy-subrc EQ 0.
  clear <ft>.
ENDMETHOD.

My problems are:

1) When I call the method of GET_REFERENCE and get a runtime error on the below statement of private method CLEAR_INTERNAL_DATA:

ASSIGN itab_ref->* TO <ft>.

The runtime analysis tell me that field-symbols <FT> is a protected against. I do not know why this object are protected since it point to private attribute of itab_ref-. How I can change it into un-protected??

2)If I set the parameter ITAB of method GET_REFERENCE to BY PASSING VALUE, it return the EXPORTING parameter IP_REF to calling program with a data reference(in my calling program, the data ref REF receive the value from this method), When I check the REF in debug mode I found it is a FREED STACK data ref and it can not assign the value to field symbol by below statement:

*  ASSIGN ref->* TO <ft>.

Can any friends can give me some message on above question?? Thanks in advance.

Best Regards

Joe