abap引用变量->*

首先,先翻译一下SAP对引用变量->*的解释如下:

If you specify a data reference dref for a mem_area that was dereferenced using the dereferencing operator ->*,
the storage area of the data object is assigned to the field symbol.
如果你为内存区域指定也给数据引用DREF,那么解除引用使用解引用运算符->*,数据对象的存储区域将分配到字段符号。

The data object concerned is the one to which dref points. If the reference variable dref does not reference any data object,
the assignment is not carried out and sy-subrc is set to 4.
有关的数据对象是一个到DREF的指针。如果参照变量dref不引用任何数据对象,那个分配将不能执行并且SY-SUBRC设置成4.
In contrast to all the other operand positions where the specification of dref->* is only possible as of Release 6.10 and the data reference dref must be fully typed,
the specification of dref->* was already possible with Release 4.6 in the statement ASSIGN.
在对比所有其他运算数位置,那个规格DREF->*是仅可能作为发布6.10并且数据引用dref必须完全匹配。DREF-> *规格已经在发行版4.6中声明分配。
In the statement ASSIGN, dref can be typed generically using TYPE REF TO data.
Furthermore, the data referencing of a data reference that does not point to any data object does not cause an exception that cannot be handled, but only in the statement ASSIGN.
对于声明ASSIGN,dref可以使用TYPE REF TO data去进行一般定义。
此外,引用的数据参考不指向任何数据对象不会引起无法处理的异常,但是仅仅在声明ASSIGN。

Since Release 6.10, dref->* can also be specified in the dynamic variants mentioned as a field content,
and after dref->* it is possible to enter offset or length specifications - if dref is completely typed.
自从6.10发布版本,dref->*也能够作为一个字段内容在动态变量方法中被确定。
随后dref->* 它可以输入偏移量或长度规格-当dref是完全定义。

  TYPES:
  BEGIN OF T_STRUCT,
    COL1 TYPE I,
    COL2 TYPE I,
  END OF T_STRUCT.

DATA:
  DREF1 TYPE REF TO DATA,
  DREF2 TYPE REF TO DATA,
  DREF3 TYPE REF TO DATA.

FIELD-SYMBOLS:
  <FS1> TYPE T_STRUCT,
  <FS2> TYPE I,
  <FS3> TYPE T_STRUCT,
  <FS4> TYPE T_STRUCT,
  <FS5> TYPE T_STRUCT,
  <FS6> TYPE T_STRUCT.

CREATE DATA DREF1 TYPE T_STRUCT.

WRITE ‘<1> 引用变量给字段符号<FS1>赋值输出’.
SKIP.

IF DREF1 IS BOUND.
  ASSIGN DREF1->* TO <FS1>.

  <FS1>-COL1 = 1.
  <FS1>-COL2 = 2 .

  WRITE:
    <FS1>-COL1,
    <FS1>-COL2.

  SKIP.

  WRITE ‘<2> 引用变量给字段符号<FS3>赋值输出’.
  SKIP.
  ASSIGN DREF1->* TO <FS3>.

  WRITE:
    <FS3>-COL1,
    <FS3>-COL2.
  SKIP.
  WRITE ‘   引用变量给字段符号赋值结束后,没有释放地址!’.

  SKIP.
  WRITE ‘<3> 引用变量之间是地址赋值,仍然可以输出值’.
  DREF2 =  DREF1.

  ASSIGN DREF2->* TO <FS4>.

  SKIP.

  WRITE:
    <FS4>-COL1,
    <FS4>-COL2.
  SKIP.
  WRITE ‘<4> 改变字段符号中字段值,把地址赋给引用变量DREF1后,’.
  SKIP.
  WRITE ‘    引用变量DREF1通过字段符号<FS5>可以看到数据改变.’.

  <FS4>-COL1 = 8.
  <FS4>-COL2 = 9.

  GET REFERENCE OF <FS4> INTO DREF1.

  ASSIGN DREF1->* TO <FS5>.

  SKIP.

  WRITE:
    <FS5>-COL1,
    <FS5>-COL2.

  SKIP.
  WRITE ‘<5> 引用变量进行强制类型装换,若不加CASTING会输出short down.’.
  ASSIGN DREF2->* TO <FS2> CASTING.

  WRITE / <FS2>.

  SKIP.
  WRITE ‘<6> 解除字段符号,释放内存以及数据.’.
  UNASSIGN <FS2>.
*    WRITE / <FS2>.
  SKIP.
  WRITE ‘当输出WRITE / <FS2>时会出现short down’.
  SKIP.

  WRITE ‘<7> 解除引用变量,释放内存以及数据.’.
  CLEAR DREF2.
     ASSIGN DREF2->* TO <FS6>.

  SKIP.
  WRITE ‘当输出WRITE /<FS6>-COL1,<FS6>-COL2.时会出现short down’.
*  WRITE:
*    <FS6>-COL1,
*    <FS6>-COL2.
ENDIF.

 程序输出界面如下:

abap引用变量分析

abap引用变量分析

通过SAP帮助中的解释“如果你为内存区域指定也给数据引用DREF,那么解除引用使用解引用运算符->*,数据对象的存储区域将分配到字段符号。”会让人产生误解。以为只要进行ASSIGN后,引用变量就会释放地址。实际上根据我以上的例子,可以看到它并不会释放内存地址。

 

通俗一点理解,那个ASSIGN DREF2->* TO <FS2> 就是C#、C++、JAVA的地址指针赋值。只不过是需要借助于字段符号<XX>来输出值。

 

备注:个人翻译SAP一些帮助,仅仅供大家参考。若各位大仙有不同意见,请在日志中积极回复。

METHOD set_title. DATA: lo_worksheets_iterator TYPE REF TO zcl_excel_collection_iterator, lo_worksheet TYPE REF TO zcl_excel_worksheet, lv_rangesheetname_old TYPE string, lv_rangesheetname_new TYPE string, lo_ranges_iterator TYPE REF TO zcl_excel_collection_iterator, lo_range TYPE REF TO zcl_excel_range, lv_range_value TYPE zexcel_range_value, lv_errormessage TYPE string. " Can't pass '...'(abc) to exception-class *--------------------------------------------------------------------* * Check whether title consists only of allowed characters * Illegal characters are: / \ [ ] * ? : --> http://msdn.microsoft.com/en-us/library/ff837411.aspx * Illegal characters not in documentation: ' as first character *--------------------------------------------------------------------* IF ip_title CA '/\[]*?:'. lv_errormessage = 'Found illegal character in sheetname. List of forbidden characters: /\[]*?:'(402). zcx_excel=>raise_text( lv_errormessage ). ENDIF. IF ip_title IS NOT INITIAL AND ip_title(1) = `'`. lv_errormessage = 'Sheetname may not start with &'(403). " & used instead of ' to allow fallbacklanguage REPLACE '&' IN lv_errormessage WITH `'`. zcx_excel=>raise_text( lv_errormessage ). ENDIF. *--------------------------------------------------------------------* * Check whether title is unique in workbook *--------------------------------------------------------------------* lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). WHILE lo_worksheets_iterator->has_next( ) = abap_true. lo_worksheet ?= lo_worksheets_iterator->get_next( ). CHECK me->guid <> lo_worksheet->get_guid( ). " Don't check against itself IF ip_title = lo_worksheet->get_title( ). " Not unique --> raise exception lv_errormessage = 'Duplicate sheetname &'. REPLACE '&' IN lv_errormessage WITH ip_title. zcx_excel=>raise_text( lv_errormessage ). ENDIF. ENDWHILE. *--------------------------------------------------------------------* * Remember old sheetname and rename sheet to desired name *--------------------------------------------------------------------* lv_rangesheetname_old = zcl_excel_common=>escape_string( me->title ) && '!'. me->title = ip_title. *--------------------------------------------------------------------* * After changing this worksheet's title we have to adjust * all ranges that are referring to this worksheet. *--------------------------------------------------------------------* lv_rangesheetname_new = zcl_excel_common=>escape_string( me->title ) && '!'. lo_ranges_iterator = me->excel->get_ranges_iterator( ). "workbookglobal ranges WHILE lo_ranges_iterator->has_next( ) = abap_true. lo_range ?= lo_ranges_iterator->get_next( ). lv_range_value = lo_range->get_value( ). REPLACE ALL OCCURRENCES OF lv_rangesheetname_old IN lv_range_value WITH lv_rangesheetname_new. IF sy-subrc = 0. lo_range->set_range_value( lv_range_value ). ENDIF. ENDWHILE. IF me->ranges IS BOUND. "not yet bound if called from worksheet's constructor lo_ranges_iterator = me->get_ranges_iterator( ). "sheetlocal ranges, repeat rows and columns WHILE lo_ranges_iterator->has_next( ) = abap_true. lo_range ?= lo_ranges_iterator->get_next( ). lv_range_value = lo_range->get_value( ). REPLACE ALL OCCURRENCES OF lv_rangesheetname_old IN lv_range_value WITH lv_rangesheetname_new. IF sy-subrc = 0. lo_range->set_range_value( lv_range_value ). ENDIF. ENDWHILE. ENDIF. ENDMETHOD.
08-23
内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值