Символ поля и ссылка на данные в SAP-ABAP

Если мы сравним символы поля ABAP и ссылки на данные с указателем в C, мы заметим : -

в C, скажем, мы объявляем переменную" var "типа" integer "со значением по умолчанию"5".

переменная " var "будет храниться где-то в памяти, и скажем, адрес памяти, который содержит эту переменную, - "1000".

теперь мы определяем указатель "ptr", и этот указатель присваивается нашей переменной.

Итак, " ptr "будет" 1000 " и "*ptr " будет 5.

давайте сравним вышеуказанную ситуацию в ABAP.

здесь мы объявляем символ поля " FS "и присваиваем его переменной"var".

теперь мой вопрос: Что такое" FS"? Я тщательно искал это в интернете, но узнал, что многие консультанты ABAP считают, что FS содержит адрес переменной, т. е. 1000. Но это неправильно. Во время отладки я обнаружил, что fs содержит только 5. Таким образом, fs (в ABAP) эквивалентен *ptr (в C). Пожалуйста, поправьте меня, если мое понимание неверно.

теперь давайте объявим ссылку на данные " dref "и другой поданный символ" fsym", и после создания ссылки на данные мы назначаем то же самое символу поля . Теперь мы можем делать операции с этим символом поля. Таким образом, разница между данными refernec и символом поля: -

в случае символа поля сначала мы объявим переменную и назначим ее символу поля.

в случае ссылки на данные сначала мы craete ссылку на данные, а затем назначьте это символу поля.

тогда в чем польза ссылки на данные? Такую же функциональность мы можем достигнуть через символ поля также.

4 ответов


поле-символ очень похож на указатель, но вы можете только доступ в разыменован форма. Другими словами, он будет содержать внутри адрес памяти переменной, которая была назначена ему, но он не позволит вам увидеть адрес памяти, только данные, которые хранятся в переменной, на которую он указывает. Это можно доказать, потому что если вы измените содержимое символа поля, указывающего на внутреннюю строку таблицы, вы увидите, что изменения будут сделаны непосредственно в линия.

ссылка на данные действует как простой указатель, за исключением того, что вы не можете увеличить или уменьшить адрес памяти, как в C (ptr++, ptr-- и т. д.). Он отличается от символа поля, поскольку можно сравнить две ссылки на данные, чтобы проверить, указывают ли они на одно и то же место в памяти. Сравнение двух символов поля будет простым сравнением значений. Другое отличие состоит в том, что вы можете динамически распределять память, создавая ссылки на данные с помощью команды CREATE DATA. Ля поле-символ может быть присвоен только уже выделенной переменной.


хотя ссылки на данные и символы полей выглядят очень похожими и часто используются аналогичным образом (см. другие ответы), они принципиально отличаются.

ссылки на данные-это переменные, которые хранят значение, как строку или целое число. Они имеют фиксированный размер в памяти и содержимого. Единственное отличие заключается в том, что эти ссылки являются указателями на другие объекты данных, i. e. содержание имеет особое значение. Они могут указывать в никуда, их можно разыграть, ты. может передавать их в другие подпрограммы, вы можете манипулировать либо указателем (GET REFERENCE) или значение, на которое он указывает. Ничего особенного, на самом деле-просто указатели, как вы их знаете из вашего любимого языка программирования.

символы полей не являются "реальными" переменными. The документация утверждает, что

они физически не резервируют место для поля

символы поля действительно только умные манипуляции локального таблица символов виртуальной машины ABAP. Я постараюсь проиллюстрировать это - обратите внимание, что это сильно упрощенная модель. Допустим, вы объявляете три переменные:

DATA: my_char TYPE c,
      my_int  TYPE i,
      my_ref  TYPE REF TO i.

тогда таблица символов будет содержать - среди прочего-записи, которые могут выглядеть следующим образом:

name       type  size addr
------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461

(я не уверен в фактическом размере ссылочной переменной.)

эти записи указывают только на адрес, содержащий значения. В зависимости от области применения этих переменных, они могут находиться в совершенно разных местах памяти, но это не наша забота. Важными моментами являются:

  • память должна быть зарезервирована для переменных (это делается автоматически, даже для ссылок).
  • ссылки работают так же, как и все другие переменные.

давайте добавим к этому символ поля:

FIELD-SYMBOLS: <my_fs> TYPE any.

тогда символ может выглядеть так:

name       type  size addr     target
--------------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461
<MY_FS>    *        

символ поля создано в исходном состоянии (не назначено). Он никуда не указывает, и использование его в этом состоянии приведет к короткому дампу. Важный момент:он не поддерживается памятью "кучи", как другие переменные. давайте

ASSIGN my_char TO <my_fs>.

снова символ может выглядеть так:

name       type  size addr     target
--------------------------------------
MY_CHAR    c        1 0x123456
MY_INT     i        4 0x123457
MY_REF     r        ? 0x123461
<MY_FS>    *                   MY_CHAR

теперь, при обращении <my_fs>, система выполнения распознает его как символ поля, ищет текущую цель в таблице символов и перенаправляет все операции на фактическое местоположение my_char. С другой стороны, если бы вы дали команду

GET REFERENCE OF my_int INTO my_ref.

таблица символов не изменится, но в "адресе кучи" 0x123461 вы найдете "адрес" 0x123457. Просто присвоение значения, как my_char = 'X' или my_int = 42 * 2.

это в очень упрощенной версии, почему вы не можете передавать символы полей в качестве изменяющихся параметров и разрешать им переназначаться внутри подпрограммы. Они не существуют одинаково. это делают другие переменные, и они не имеют значения вне области таблицы символов, в которую они были добавлены.


символ поля, который был вокруг в ABAP гораздо дольше, позволяет манипулировать и передавать значения полей во время выполнения, не зная имя поля заранее. Рассмотрим этот вариант использования: у вас есть структура с 20 полями, вы можете ссылаться на каждое поле по имени и назначить его символу поля, а затем изменить значение конкретного поля и т. д.

ссылка на данные (TYPE REF TO DATA), который является относительно новым дополнением к ABAP, позволяет вам создать экземпляр данных во время выполнения, не зная тип заранее используя оператор "CREATE DATA".

пример использования CREATE DATA, см. следующую страницу справки SAP. Он показывает вам, как вы можете, например, получить ссылку на ссылочный объект (т. е. ссылку на объекты ABAP) с помощью CREATE DATA, что вы не могли бы сделать с символом поля:http://help.sap.com/abapdocu_70/en/ABAPCREATE_DATA_REFERENCE.htm


символ поля-nomen est omen-символ поля. Вы назначаете его переменной, и она становится псевдонимом для этой переменной.

основное различие между ссылкой и символом поля заключается в том, что ссылка может указывать на анонимные данные, созданные CREATE DATA или CREATE OBJECT. Символы полей всегда должны быть назначены существующей переменной.