程序运行结果如下,i_num3变量在调用子程序后值变为了30. 2、值传递(CALL BY VALUE)
值传递就是将参数的值复制一份到另一个至内存地址中,所以在子程序中参数变量的值的改变不影响外部程序实际变量的值。
语法:
FORM <subform> [USING VALUE(f1) VALUE(f2)...]...
PERFORM <subform> [USING VALUE(f1) VALUE(f2)...]...
VALUE(f1) VALUE(f2)是按值传递的CALL BY VALUE
DATA: i_num1 TYPE i VALUE 10,
i_num2 TYPE i VALUE 20,
i_num3 TYPE i.
WRITE: /'原数据',
/'I_NUM1=',i_num1,
'I_NUM2=',i_num2,
'I_NUM3=',i_num3.
PERFORM calculator_two USING i_num1 i_num2 CHANGING i_num3.
WRITE: / 'perform返回的数据',
/ 'I_NUM1=',i_num1,
'I_NUM2=',i_num2,
'I_NUM3=',i_num3.
*值传递 using value(f1)
FORM calculator_two USING value(num1) value(num2) CHANGING sum.
1、引用传递(CALL BY REFERENCE)
传递参数时将参数的地址(ADDRESS)传至子程序中,也就是子程序中的参数变量与外部程序的参数变量共享地址内的值。又叫CALL BY ADDRESS,若子程序中的参数变量的值发生了改变,那么,外部程序的实际变量的值也发生改变。
语法:
FORM <subform> [USING <f1> <f2>...] [CHANGING <fr1> <fr2>...]
PERFORM <subform> [USING <f1> <f2>...] [CHANGING <fr1> <fr2>...]
USING 之后跟随着不会发生变化的子程序参数,CHANGING后面的参数按引用传递,值会随着子程序内的变化而变化。
2、值传递(CALL BY VALUE)
值传递就是将参数的值复制一份到另一个至内存地址中,所以在子程序中参数变量的值的改变不影响外部程序实际变量的值。
语法:
FORM <subform> [USING VALUE(f1) VALUE(f2)...]...
PERFORM <subform> [USING VALUE(f1) VALUE(f2)...]...
VALUE(f1) VALUE(f2)是按值传递的CALL BY VALUE
当只按USING的方式传递参数时其也是按引用的方式传递,共享内存地址。如下:
3、值传递参数并返回最终值(CALL BY VALUE AND RETURN RESULT)
传递参数的方式同值传递相同,但在子程序结束执行是会将传入参数变量的最终值回传一份给外部程序变量。
语法:FORM <subform> [.....] [CHANGING VALUE(f1)...]
PERFORM <subform> [.....] [CHANGING VALUE(f1)...]
CHANGING VALUE(f1)首先按CALL BY VALUE而后RETURN RESULT给外部变量.
注:using 也是可以传递内表数据的
根据实际项目经验,using,changing都会回传影响实参的,下面的新版系统代码检查时的系统报错: