繁体   English   中英

ABAP 中的字段符号和数据引用概念

Field symbol and data reference concept in ABAP

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

如果我们将 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”,在创建数据引用后,我们将相同的值分配给字段符号。 现在我们可以对这个字段符号进行操作。 所以数据引用和字段符号之间的区别是:-

如果首先是字段符号,我们将声明一个变量并将其分配给字段符号。

在数据引用的情况下,我们首先创建一个数据引用,然后将其分配给字段符号。

那么数据引用有什么用呢? 我们也可以通过字段符号实现相同的功能。

4 个回复

字段符号很像指针,但只能以取消引用的形式访问。 换句话说,它将在内部保存分配给它的变量的内存地址,但它不允许您查看内存地址,只能查看存储在它指向的变量中的数据。 这是可以证明的,因为如果您更改指向内部表格行的字段符号的内容,您将看到更改将直接在行中进行。

数据引用就像一个简单的指针,除了您不能像在 C(ptr++、ptr-- 等)中那样递增或递减内存地址。 它与字段符号不同,因为您可以比较两个数据引用以检查它们是否指向内存中的完全相同的位置。 比较两个字段符号将是一个简单的值比较。 另一个区别是您可以通过使用 CREATE DATA 命令创建数据引用来动态分配内存。 字段符号只能分配给已分配的变量。

尽管数据引用和字段符号看起来非常相似并且经常以类似的方式使用(请参阅其他答案),但它们根本不同。

数据引用是存储值的变量,就像字符串或整数一样。 它们在内存和内容中具有固定大小。 唯一的区别是这些引用是指向其他数据对象的指针,即内容具有特殊含义。 它们可以无处指向,可以取消引用,可以将它们传递给其他例程,可以操作指针( GET REFERENCE )或其指向的值。 没有什么特别的,真的 - 只是你从你最喜欢的编程语言中知道的指针。

字段符号不是“真正的”变量。 文件指出

他们没有为场地预留空间

字段符号实际上只是对 ABAP VM 的本地符号表的巧妙操作。 我将尝试说明这一点 - 请注意,这是一个非常简化的模型。 假设您声明了三个变量:

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这样的赋值。

在非常简化的版本中,这就是您不能将字段符号作为更改参数传递并允许它们在 subroutine 内重新分配的原因 它们的存在方式与其他变量不同,并且它们在添加到的符号表范围之外没有任何意义。

字段符号在 ABAP 中存在的时间更长,它允许您在运行时操作和传递字段的值,而无需事先知道字段的名称 考虑这个用例:您有一个包含 20 个字段的结构,您可以按名称引用每个字段并将其分配给一个字段符号,然后更改特定字段的值等。

数据引用 ( TYPE REF TO DATA ) 是 ABAP 的一个相对较新的补充,允许您在运行时实例化数据,而无需事先使用“CREATE DATA”语句知道类型

有关使用CREATE DATA的示例,请参阅以下 SAP 帮助页面。 例如,它向您展示了如何使用CREATE DATA获取对参考对象的引用(即 ABAP 对象引用),这是您无法使用字段符号执行的操作: http : //help.sap.com/abapdocu_70/en /ABAPCREATE_DATA_REFERENCE.htm

字段符号是 - nomen est omen - 字段的符号。 您将它分配给一个变量,它就成为该变量的别名。

引用和字段符号之间的主要区别在于,引用可以指向由 CREATE DATA 或 CREATE OBJECT 创建的匿名数据。 字段符号必须始终分配给现有变量。

1 SAP ABAP:从深层结构中的表中访问字段数据?

我想从存在于深层嵌套结构中的项目表中(图像中)突出显示的字段 ID 访问数据。 然后我会执行各种检查数据是否是初始的。 在其他情况下,我实际上会从这些字段中的一个字段中选择数据,然后在深层结构中的另一个表的另一个字段中输入数据。 完成这项任务的最佳方法是什么? 这是我必须使用的一个片段: ...

2 使用参考链接创建 ABAP DOC

我正在努力创建一个漂亮的 ABAP 文档文档,当我尝试将文档链接到其他存储库对象时(根据SAP 帮助站点的语法),这不起作用: 我收到错误消息: *ABAP Doc Statement 链接此时无效* 有人可以帮我吗? ...

3 了解“通过引用序列化”的概念

我正在编写自己的针对游戏开发优化的二进制序列化程序。 到目前为止,它已经完全可用。 预先发出给定类型的序列,它会发出IL以生成反序列化方法。 唯一缺少的功能是通过引用序列化事物,当前所有事物都通过值序列化。 为了实现它,我必须先了解它。 这是我发现有些棘手的问题。 让我向您展示我 ...

4 通过引用“先进”的概念?

当你这样做: 要解决此问题,请执行以下操作 我知道40是常数但是如果我这样做会怎么样: 为什么只有const关键字才可以? 这是编译器保护的方式,没有人可以改变x引用的值吗? 40是一个const所以我们甚至不知道它在内存中的位置,但编译器不应该知道这个地址,因此 ...

5 PHP参考概念与数组

&``符号如何在PHP中用于数组? 当我执行以下代码 执行以上代码后,输出如下: 请解释以下声明 ...

6 在 ABAP 中从 mscomm 读取数据

我正在尝试通过MSCOMM32对象读取从串行端口发送的数据。 我得到的是## 。 首先,我将十六进制转换为字符串并发送到 COMM 端口: 然后连接到串口的机器会给出响应。 我使用以下代码读取数据: 我可以使用监控设备看到响应,但我得到的输入只是## ,当我将此##转换为十六进制时,我会 ...

2019-11-06 09:56:36 1 229   abap
7 位域的概念

输出为:-2,-2,1 在C complier和C ++编译器中输出上述代码的内容是什么? 为什么? ...

8 Angular 4数据绑定概念

我正在创建一个Angular应用程序,并且在数据绑定方面需要一些帮助。 我有一个仪表板,其中有不同的小部件。 每个小部件都有一个名称和日期。 为了配置/更改此设置,我创建了可以显示的补充工具栏。 我正在使用路由器显示仪表板视图。 侧边栏不是仪表板的子级,而是位于路由器外部。 ...

9 帮助核心数据概念

只想确认我的输入正确无误,并想看一些示例代码。 当我想向核心数据添加新记录时,我创建了NSManagedObject子类的新实例,对吗? 那呢 (欢迎使用一些示例代码。) ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM