模块化技术《子程序篇》

子程序大多只被定义为某一个程序调用。可以将一个应用程序中的具体功能分解成几个子程序实现,则整个程序显得易读并易于维护,并可以实现功能复用。子程序的定义与调用分别使用FORM/ENDFORM和PREFORM语句来实现。

<1>,子程序定义:
FORM subr [USING ... [VALUE()p1[]] [TYPE t|LIKE f] ... ]
        [CHANGING ... [VALUE()pn[]] [TYPE t|LIKE f] ].
    ...
    <subr codes>
    ...

    ENDFORM.

子程序不能进行嵌套(所有的处理块均不能嵌套),USING和CHANGING(以及不常用到的TABLES选项)是子程序与主程序的参数接口部分,
<subr codes>是子程序的具体代码段,主程序就是通过调用子程序名subr来执行这个部分定义的程序代码。
主程序段调用子程序的语法:
PREFORM subr [USING ... p1 ... ]
        [CHANGING ... p2 ... ].
简单实例:
REPORT z_subr.
DATA: int1 TYPE i VALUE 1,
      int2 TYPE i VALUE 2,
      sum TYPE i.
START-OF-SELECTION.
      PERFORM add.
      WRITE sum.
FORM add.
      sum = int1 + int2.
ENDFORM.

ABAP有辅助生成成功能,步骤:
1).在一个新程序中输入语句:PERFORM subr.
2).双击该子程序名,系统会询问是否生成子程序定义,单击确定后,子程序的代码框会自动出现。
3).若子程序以定义,双击咋会自动导航之代码处。

<2>,参数接口
形参:在子程序定义部分使用USING和CHANGING进行指定的参数,只能在子程序出现。
实参:调用子程序时在PREFORM语句中使用同样的附加项进行传递的参数。
REPORT z_canshu.
DATAint1 TYPE VALUE 1,       int2 TYPE VALUE 2,
      int3 TYPE VALUE 3,       int4 TYPE VALUE 4,
      sum TYPE i.
*Passing Parameters
PERFORM add USING int1 int2.
PERFORM add USING int3 int4.
*Defining Parameters
FORM add USING p1 p2.
    sum p1 + p2.
    WRITE/' int1 + int2 = 'sum.

ENDFORM.

<3>,参数传递方式

子程序的参数传递方式分为值传递和引用传递,以及一种较特殊的值和结果传递。

引用传递:子程序调用期间,将实参的地址产给形参,而形参本身不占用内存。对形参进行修改,主程序的数据对象值也会随之改变。

FORM ... [USING pi ... Pn] ...

FORM ... [CHANGE pi ... Pn] ...            //其中参数没有VALUE项

                        USING       USING VALUE       CHANGE       CHANGE VALUE
参数传递方式     引用                值                      引用                   值
值是否改变         变                  不变                     变              当正常结束后改变(Exit,CHECK,ENDFORM)

值传递:形参作为实参的副本被创建,形参有自己的内存,更改形参不会影响到实参本身的内容。若子程序只使用主程序数据,或实现某些输出的功能,并不打算修改主程序变量的值,则应选择值传递。

FORM ... USING ... VALUE(Pi1) ... VALUE(Pi2) ...

特殊的形参定义方式: 称为值和结果传递。

FORM ... CHANGE ... VALUE(Pi) ... VALUE(Pi2) ...

与值传递相似,但是子程序正常结束是,将把对形式参数的更改“结果”复制给实参,因而主程序中的实参仍会被修改。如果子程序非正常中断,则参数变量保持原值。

<4>,参数类型及兼容
一般情况下性参可以代表多种类型的实参,所以不需要某一种特殊定类型,但是实参类型,必须确定。指定参数类型有两种,第一种是为一般类型,只在运行期内才将是参的具体结构传递给形参,所以只能使用其整体属性,而不能使用其具体结构。


猜你喜欢

转载自blog.csdn.net/littlemangoyx/article/details/80223522