当前位置:文档之家› SAP-第009章 模块化ABAP

SAP-第009章 模块化ABAP

SAP-第009章 模块化ABAP
SAP-第009章 模块化ABAP

第九章模块化 ABAP/4 程序

概览

内容

源代码模块 ...................................................................... 1宏的定义与调用 .................................................................. 1

包含程序 ......................................................................... 2子程序.......................................................................... 3定义子程序 ....................................................................... 3

调用子程序 ....................................................................... 3

在调用程序与子程序之间进行数据传递............................................. 5

在子程序中定义局部数据类型和对象............................................. 13

中断子程序 ..................................................................... 15功能模块...................................................................... 16使用现有功能模块 .............................................................. 16

创建和编写功能模块 ............................................................ 18

本章将介绍如何模块化 ABAP/4 程序。如果程序包含相同或相似的语句块,或者希望多次处理相同函数,应用模块化技术可以避免冗余。

通过模块化 ABAP/4 程序,使得程序易读,并改善程序的结构。与未模块化的程序相比,模块化程序更易于维护和更新。

模块化原则:

The result of N2 - N1 is 1

这样就定义了两个宏: OPERATION 和 OUTPUT。 OUTPUT 嵌套在 OPERATION 中。OPERATION 先后三

次被其他参数调用。应注意占位符 &1、&2、…在宏中是如何被替换的。

包含程序

如果要在多个程序中使用相同的语句序列,则可一次性将其代码编写到包含程序中。例如,当希望在不同程序中使用的数据声明较长时,这一点将非常重要。

以下主题说明:

不能与包含程序进行显式数据传递,因为包含程序的目的是模块化源代码。如果想与模块进行

数据传递,请使用子程序或功能模块。

创建包含程序

要创建包含程序,请按以下章节所述步骤进行:

创建简单的 ABAP/4 程序 (页 1–1)

对于程序属性类型,必须使用类型 I。具体说明参见:

重要的程序属性 (页 1–4) 通过双击 ABAP/4 程序中 INCLUDE 语句后的程序名,还可以创建或更改包含程序(参见使用包含程序 (页2) )。这样既可以创建新程序,又可以更改现有程序。

不能单独运行包含程序,而必须从其它程序中调用。

可以从其它包含程序中调用包含程序。

编写 INCLUDE 程序源代码的唯一限制如下:

_ 包含程序不能包含 PROGRAM 或 REPORT 语句。

_ 包含程序不能调用自身。

_ 包含程序必须包含完整语句。

但是,必须确保包含程序语句在逻辑上符合调用它的程序源代码。在编辑器中编辑包含程序时,选择“检查”通常还无法保证这一点。

***INCLUDE INCL-TST.

TEXT = 'Hello!'.

在此,语法检查报告错误,因为没有声明 TEXT 字段。但是,在用合适的类型定义了字段 TEXT

的任何程序中,都可以调用程序 INCL-TST。

要想从语法检查中获得有意义的结果,必须为调用包含程序的程序进行语法检查(参见使用包含程序 (页2) )。

使用包含程序

要从另一个 ABAP/4 程序中调用包含程序,请使用 INCLUDE 语句,用法如下:

语法

INCLUDE .

在语法检查期间和生成期间,该语句将源代码 插入到 ABAP/4 程序中。INCLUDE 语句的功能类似于把 源代码复制到调用程序中语句的位置上。

INCLUDE 语句必须单独占一行,并且不能扩展到多行。

包含程序不是运行时装载的,而是在程序生成前就被解析。程序生成后,则包含所用全部包含程序的源代码。

假设编写了如下的包含程序:

***INCLUDE STARTTXT.

WRITE: / 'Program started by', SY-UNAME,

/ 'on host', SY-HOST,

'date:', SY-DATUM, 'time:', SY-UZEIT.

ULINE.

可以从任何其它 ABAP/4 程序调用该程序。例如,如果希望编写输出功能模块的标准表头,请在

PROGRAM 或 REPORT 之后插入 INCLUDE 语句,方法如下:

PROGRAM SAPMZTST.

INCLUDE STARTTXT.

............

输出结果如下:

Program started by FRED

on host hs1077 date: 07/19/1995 time: 09:00:39

___________________________________________________________

................

子程序

子程序是可以从 ABAP/4 中调用的程序。定义子程序的目的是为了避免重复编写程序中频繁使用的某些部分或频繁使用的算法。可以与子程序进行显式数据传递。

有两种类型的子程序:

_ 内部子程序:

内部子程序的源代码与调用程序(内部调用)位于同一 ABAP/4 程序中。

_ 外部子程序:

外部子程序的源代码位于 ABAP/4 程序中而不是调用程序(外部调用)中。

尽管内部子程序主要用于模块化及结构化单个程序,某个 ABAP/4 程序中内部调用的子程序可以从另一个ABAP/4 程序中外部调用。另外,也可以创建只包含子程序的 ABAP/4 程序。这些程序不能自己运行,而是被其它 ABAP/4 程序作为外部子程序库来调用。

下列主题说明

定义子程序

子程序是以 FORM 开头、以 ENDFORM 结尾的代码块。要定义子程序,请使用下列语法:

语法

FORM [].

ENDFORM.

定义子程序名。 选项用于指定如何与子程序进行数据传递。

_ 对于内部子程序,不必使用 选项,但子程序可以访问主 ABAP/4 程序中声明的所有数据对象。

_ 对于外部子程序,必须决定是使用 选项,还是在内存公用部分声明数据对象。

有关与子程序进行数据传递的详细信息,参见在调用程序与子程序之间进行数据传递 (页5)

如果在同一程序中定义内部子程序,并且不使用事件关键字,则应将其分组集中在程序末尾,以免影响程序流程(参见定义过程块 (页Error! Not a valid link.) )。

子程序不能包含嵌套的 FORM-ENDFORM 块。

FORM HEADER.

WRITE: / 'Program started by', SY-UNAME,

/ 'on host', SY-HOST,

'date:', SY-DATUM, 'time:', SY-UZEIT.

ULINE.

ENDFORM.

这样就创建了子程序 HEADER,该子程序可用于创建输出列表的表头(请与使用包含程序 (页

2) 中的示例进行比较)。

调用子程序

可以调用代码位于同一 ABAP/4 程序中的子程序(内部调用),也可调用代码位于其它 ABAP/4 程序中的子程序(外部调用)。

可以运行时指定子程序名,或从给定列表中调用子程序。

不仅可以从子程序中调用子程序(嵌套调用),子程序也可以调用自己(递归调用)。

调用内部子程序

要调用内部子程序,请使用 PERFORM 语句,用法如下:

语法

PERFORM [].

调用子程序 。在 选项中,指定如何与子程序进行数据传递。如果不使用 选项,子程序也可以访问主 ABAP/4 程序中声明的所有数据类型和对象。该数据叫做全局数据,如果不被同名局域数据隐藏,该数据对子程序可见(关于数据传递的详细信息,参见在调用程序与子程序之间进行数据传递 (页5) )。

PROGRAM SAPMZTST.

DATA: NUM1 TYPE I,

NUM2 TYPE I,

SUM TYPE I.

NUM1 = 2. NUM2 = 4.

PERFORM ADDIT.

NUM1 = 7. NUM2 = 11.

PERFORM ADDIT.

FORM ADDIT.

SUM = NUM1 + NUM2.

PERFORM OUT.

ENDFORM.

FORM OUT.

WRITE: / 'Sum of', NUM1, 'and', NUM2, 'is', SUM.

ENDFORM.

输出如下:

Sum of 2 and 4 is 6

Sum of 7 and 11 is 18

在该示例中,程序末尾定义了两个内部子程序:ADDIT 和 OUT。ADDIT 从该程序中调用,OUT 从

ADDIT 调用。子程序自动具有字段 NUM1、 NUM2 和 SUM 的访问权限。

调用外部子程序

要调用外部子程序,请使用 PERFORM 语句,用法如下:

语法

PERFORM () [] [IF FOUND].

调用程序 中定义的子程序 。如果希望与子程序进行数据传递,必须定义 选项或者使用公用部分(关于进行数据传递的详细信息,参见在调用程序与子程序之间进行数据传递 (页5) )。

如果使用 IF FOUND 选项,并且程序 中没有子程序 ,系统就忽略 PERFORM 语句。

启动调用外部子程序的程序时,如果定义了子程序的程序不在内存中,ABAP/4就将其装载到内存中。为了节省存储空间,尽量将不同程序中定义的子程序数目限制到最小。

假定程序包含下列子程序:

PROGRAM FORMPOOL.

FORM HEADER.

WRITE: / 'Program started by', SY-UNAME,

/ 'on host', SY-HOST,

'date:', SY-DATUM, 'time:', SY-UZEIT.

ULINE.

ENDFORM.

可以从程序中调用子程序,方法如下:

PROGRAM SAPMZTST.

PERFORM HEADER(FORMPOOL) IF FOUND.

在该示例中,调用程序与子程序之间没有数据传递。与使用包含程序 (页2) 中的示例一样,

该子程序执行输出语句。

运行时指定子程序名

运行时,可以指定要调用的子程序名以及存储子程序的程序名。为此请使用 PERFORM 语句,用法如下:

语法

PERFORM () [IN PROGRAM ()] [] [IF FOUND].

系统执行字段 中存储的子程序。如果使用 IN PROGRAM 选项,系统在字段 中存储的程序内查找子程序(外部调用)。否则,系统在当前程序中查找子程序(内部调用)。

使用该语句还可在程序代码中指定子程序名和外部程序名。为此请忽略括弧。

选项指定如何与子程序进行数据传递(关于数据传递的详细信息,参见在调用程序与子程序之间进行数据传递 (页5) )。如果使用 IF FOUND 选项,找不到子程序 时,系统就忽略 PERFORM 语句。

假定程序包含子程序:

PROGRAM FORMPOOL.

FORM SUB1.

WRITE: / 'Subroutine 1'.

ENDFORM.

FORM SUB2.

WRITE: / 'Subroutine 2'.

ENDFORM.

可在运行时指定子程序名,如下所示:

PROGRAM SAPMZTST.

DATA: PROGNAME(8) VALUE 'FORMPOOL',

SUBRNAME(8).

SUBRNAME = 'SUB1'.

PERFORM (SUBRNAME) IN PROGRAM (PROGNAME) IF FOUND.

SUBRNAME = 'SUB2'.

PERFORM (SUBRNAME) IN PROGRAM (PROGNAME) IF FOUND.

输出如下:

Subroutine 1

Subroutine 2

字符字段 PROGNAME 包含程序名,该程序包含子程序。子程序名被分配给字符字段 SUBRNAME。

从列表中调用子程序

要从列表中调用特定子程序,请使用 PERFORM 语句,用法如下:

语法

PERFORM OF ....

.

系统执行子程序列表中位于 处的子程序。PERFORM 语句的这一变量只对内部调用有效。字段 既可以是变量也可以是文字。

PROGRAM SAPMZTST.

DO 2 TIMES.

PERFORM SY-INDEX OF SUB1 SUB2.

ENDDO.

FORM SUB1.

WRITE / 'Subroutine 1'.

ENDFORM.

FORM SUB2.

WRITE / 'Subroutine 2'.

ENDFORM.

输出如下:

Subroutine 1

Subroutine 2

在该示例中,从列表中连续调用两个内部子程序:SUB1 和 SUB2。

在调用程序与子程序之间进行数据传递

就内部和外部子程序而言,处理数据的缺省方法有所不同。

_ 对于内部子程序,如果调用程序的全局数据未被同名局部数据隐藏,可直接从子程序进行访问。该全局数据由内部数据对象和类型以及 ABAP/4 词典字段组成。ABAP/4 词典字段由程序中

的 TABLES 引用。(关于该语句的详细信息,参见BC ABAP/4 用户指南 (页Error! Not a valid

link.) )。

_ 如果希望采用与内部子程序相同的方式,从外部子程序访问调用程序数据,就必须在调用程序和包含外部子程序的程序中,将数据声明为公用部分(参见将数据声明为公共部分 (页

6) )。

在子程序中使用全局数据时,可以将全局数据复制到局部数据堆栈上。这一点对内部子程序中的全局数据和声明为公共部分的数据有效。为此,必须使用字段符号(关于该主题的详细信息,参见分配全局字段的本地副本 (页 10–16) )。

应该只对简单模块化程序使用公共部分。尤其在嵌套子程序调用中使用功能模块时(关于功能

模块的详细信息,参见功能模块 (页16) ),访问公共部分的规则会很复杂。

为了使程序更透明,可移植性更好,在调用程序和子程序之间进行数据传递时,应尽量选择下列方法:

在内部和外部子程序中,明确指定所需的及可能更改的数据。为此,在定义和调用子程序期间,可以使用参数。这些参数是在 FORM (参见定义子程序 (页3) )和 PERFORM (参见调用子程序 (页3) )语句的 选项中定义的。

下列主题说明

将数据声明为公共部分

要将数据声明为公共部分,请使用 DATA 语句,用法如下:

语法

DATA: BEGIN OF COMMON PART [],

,

..............

END OF COMMON PART [].

中,按 DATA 语句 (页 3–14) 所述,对要包含到公共部分中的所有数据加以声明。

子程序和调用程序自动共享 TABLES 语句定义的表格工作区。

要在调用程序和子程序中使用公共部分,必须在所涉及的全部程序中都使用完全相同的声明。因此,应将公共部分声明放到 INCLUDE 程序中(参见包含程序 (页2) )。

一个程序中可使用多个公共部分。但必须给每个公共部分分配一个名称 。如果每个程序中只使用一个公共部分,则名称 可选。

为了避免在具有不同公共部分声明的程序之间发生冲突,公共部分的名称应始终保持唯一。

假定某个 INCLUDE 程序 INCOMMON 包含公共部分 NUMBERS 的声明。公共部分由三个数字字段组

成: NUM1、 NUM2 以及 SUM:

***INCLUDE INCOMMON.

DATA: BEGIN OF COMMON PART NUMBERS,

NUM1 TYPE I,

NUM2 TYPE I,

SUM TYPE I,

END OF COMMON PART NUMBERS.

假定程序 FORMPOOL 包含 INCOMMON,同时包含子程序 ADDIT 和 OUT:

PROGRAM FORMPOOL.

INCLUDE INCOMMON.

FORM ADDIT.

SUM = NUM1 + NUM2.

PERFORM OUT.

ENDFORM.

FORM OUT.

WRITE: / 'Sum of', NUM1, 'and', NUM2, 'is', SUM.

ENDFORM.

假定调用程序 SAPMZTST 时包含 INCOMMON,并从程序 FORMPOOL 中调用 ADDIT。

PROGRAM SAPMZTST.

INCLUDE INCOMMON.

NUM1 = 2. NUM2 = 4.

PERFORM ADDIT(FORMPOOL).

NUM1 = 7. NUM2 = 11.

PERFORM ADDIT(FORMPOOL).

启动 SAPMZTST 后,输出如下:

Sum of 2 and 4 is 6

Sum of 7 and 11 is 18

该示例与调用内部子程序 (页3) 中的示例功能相同。在当前示例中,必须将程序所用数据对

象声明为公共部分,因为子程序 ADDIT 和 OUT 都被外部调用。

通过参数进行数据传递

可以用参数在调用程序和子程序之间进行数据传递。

_ 在定义子程序期间用 FORM 语句定义的参数叫做形式参数。

_ 在调用子程序期间用 PERFORM 语句指定的参数叫做实参数。

可以区分不同种类的参数:

_ 输入参数用于向子程序传递参数

_ 输出参数用于从子程序传递参数

_ 输入/输出参数用于与子程序进行参数传递

在 FORM 和 PERFORM 语句的 选项中定义参数,方法如下:

语法

FORM [TABLES ]

[USING ]

[CHANGING ]....

PERFORM [()] [TABLES ]

[USING ]

[CHANGING ]....

选项 TABLES、 USING 和 CHANGING 必须按上述顺序编写。

列表中 USING 和 CHANGING 后面的参数可以是所有类型的数据对象(参见声明数据 (页 3–1) )和字段符号(参见使用字畏_ 号 (页 10–1) )。列表中 TABLES 后面的参数既可以是有表头行的内表,也可以是不带表头行的内表。可以采用 TABLES、 USING 或 CHANGING 传送内表。

可以用变量偏移量和长度规范指定实参数(关于偏移量规范的详细信息,参见指定数据对象

的偏移量 (页 6–35) )。对于形式参数,不能采取这种方法。要参考形式参数的一部分,请将

该部分分配给字段符号,然后再传递该字段符号(参见使用字畏_ 号 (页 10–1) )。

实参数的偏移量规范功能与字段符号的偏移量规范相同(参见具有偏移量说明的静_ ASSIGN

(页 10–7) )。可以选择内存区,该内存区位于指定的实参数边界之外。

对于 FORM 语句中 USING 和 CHANGING后面列表中的每个形式参数,可以指定不同数据传递方式:_ 通过参考值调用:在子程序调用期间,仅将实参数的地址传送给形式参数。形式参数本身没有内存。在子程序中使用调用程序的字段。更改形式参数之后,调用程序中的字段内容也会

变动。

_ 通过值调用:在子程序调用期间,形式参数是作为实参数的副本创建的。形式参数有自己的内存。更改形式参数并不影响实参数。

_ 通过值和结果调用:在子程序调用期间,形式参数是作为实参数的副本创建的。形式参数有自己的内存空间。在子程序末尾,将对形式参数的更改复制给实参数。

由 TABLES 传递的内表均通过参考值调用。

关于如何指定形式参数数据类型的信息,参见

指定形式参数的数据类型对于向子程序传递结构化数据非常重要。有关如何传递结构化数据的内容(字段串和内表)在以下章节中有专门解释:

通过参考传递

要通过参考值在调用程序和子程序之间进行数据传递,请使用 FORM 和 PERFORM 语句 选项的 USING 或CHANGING,用法如下:

语法

FORM ..... [USING ... ] [CHANGING ... ] ...

PERFORM... [USING ... ] [CHANGING ... ] ...

在 USING 和 CHANGING 后面的列表中指定形式参数和实参数,而不需附加任何内容。

FORM 语句中形式参数的名称可以与 PERFORM 语句中实参数 ... and ... 的名称不同。PERFORM 语句列表中的第一个参数传递给 FORM 语句相应列表中的第一个参数,以此类推。

对于通过参考值调用, USING 和 CHANGING 完全相同。对于文档, USING 用于子程序中的固定输入参数,而CHANGING 则用于子程序中变化的输出参数。

子程序中变化的输入参数在调用程序中也会变化。要避免这一点,必须通过值传递参数。

假定程序 FORMPOOL 包含两个子程序 ADDIT 和 OUT:

PROGRAM FORMPOOL.

FORM ADDIT USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM.

ADD_SUM = ADD_NUM1 + ADD_NUM2.

PERFORM OUT USING ADD_NUM1 ADD_NUM2 ADD_SUM.

ENDFORM.

FORM OUT USING OUT_NUM1 OUT_NUM2 OUT_SUM.

...WRITE: / 'Sum of',OUT_NUM1,'and',OUT_NUM2,'is',OUT_SUM.

ENDFORM.

假定某个调用程序调用 ADDIT 和 OUT:

PROGRAM SAPMZTST.

DATA: NUM1 TYPE I,

NUM2 TYPE I,

SUM TYPE I.

NUM1 = 2. NUM2 = 4.

PERFORM ADDIT(FORMPOOL) USING NUM1 NUM2 CHANGING SUM.

NUM1 = 7. NUM2 = 11.

PERFORM ADDIT(FORMPOOL) USING NUM1 NUM2 CHANGING SUM.

启动 SAPMZTST 后,输出如下:

Sum of 2 and 4 is 6

Sum of 7 and 11 is 18

该示例与将数据声明为公共部分 (页6) 中的示例功能相同。在当前示例中,通过参考值将实

参数 NUM1、 NUM2 和 SUM 从 SAPMZTST 传递给子程序 ADDIT 的形式参数。更改 ADD_SUM 后,后

面的参数就传递给子程序 OUT 的形式参数 OUT_NUM1、 OUT_NUM2 和 OUT_SUM。

通过值传递

要确保输入参数在调用程序中保持不变(即使子程序中已被更改),可以通过值将数据传递给子程序。为此,请使用 FORM 和 PERFORM 语句 选项的 USING,用法如下:

语法

FORM ..... USING ...VALUE() ..

PERFORM... USING ....... ..

通过对 FORM 语句中 USING(关于 USING 的详细信息,参见通过参考传递 (页7) )后面列表中

的形式输入参数写入 VALUE()而不是 ,相应参数就通过值进行传递。与实字段

性相同的 PERFORM 语句调用该子程序时,就会创建一个新的局域字段 (关于局域字段的信息,

参见在子程序中定义局部数据类型和对象 (页13) )。系统处理独立于调用程序中参考字段的

该字段。

假定 FORMPOOL 程序包含子程序 FACT:

PROGRAM FORMPOOL.

FORM FACT USING VALUE(F_NUM) CHANGING F_FACT.

F_FACT = 1.

WHILE F_NUM GE 1.

F_FACT = F_FACT * F_NUM.

F_NUM = F_NUM - 1.

ENDWHILE.

ENDFORM.

假定程序 SAPMZTST 调用子程序 FACT:

PROGRAM SAPMZTST.

DATA: NUM TYPE I VALUE 5,

FAC TYPE I VALUE 0.

PERFORM FACT(FORMPOOL) USING NUM CHANGING FAC.

WRITE: / 'Factorial of', NUM, 'is', FAC.

在启动 SAPMZTST 后,输出如下:

Factorial of 5 is 120

在该示例中,计算数字 NUM 的阶乘。输入参数 NUM 被传递给子程序的形式参数 F_NUM。尽管

F_NUM 在子程序中已被更改,实参数 NUM 仍然保持其初始值。输出参数 FAC 通过参考值进行传

递。

通过值和结果进行传递

如果仅希望在子程序运行成功之后,才将更改过的输出参数从子程序返回给调用程序,请使用 FORM 和PERFORM 语句 选项的 CHANGING,用法如下:

语句

FORM ..... CHANGING ...VALUE() ..

PERFORM... CHANGING ....... ..

通过对 FORM 语句中 CHANGING(参见通过参考传递 (页7) )后面列表中的形式输入参数写入 VALUE()而不是 ,相应参数通过值和结果调用进行传递。与实字段 属性相同的 PERFORM 语句调用该子程序时,

就会创建一个新的局域字段 (关于局域字段的信息,参见在子程序中定义局部数据类型和对象 (页13) )。系统处理独立于调用程序中参考字段的字段。

仅在运行到 ENDFORM 语句时,系统才将 的当前值传递给 。如果子程序因为某个对话信息(关于信息的详细资料,参见处理错误和消息 (页Error! Not a valid link.) )而中断,则实参数 保持不变。

仅在编写对话程序(参见编写 ABAP/4 事务 (页Error! Not a valid link.) )时,通过对话信

息终止子程序才有意义。在报表程序中,子程序中的对话信息终止整个程序。在时间事件 AT

SELECTION SCREEN(参见通过事件控制 ABAP/4 程序流 (页Error! Not a valid link.) )期间,

或交互报表(参见列表中的消息 (页Error! Not a valid link.) )期间,该规则存在例外。

交互报表的选项屏幕和工具使用现存对话程序。该对话程序是作为 ABAP/4 中的关键字提供

的。

在用 PERFORM 调用子程序时,可以用 USING 代替 CHANGING。但对于文档,则应使用 FORM 语句中相同的字。

PROGRAM SAPMZTST.

DATA: OP1 TYPE I,

OP2 TYPE I,

RES TYPE I.

OP1 = 3.

OP2 = 4.

PERFORM MULTIP USING OP1 OP2 CHANGING RES.

WRITE: / 'After subroutine:',

/ 'RES=' UNDER 'RES=', RES.

FORM MULTIP USING VALUE(O1) VALUE(O2) CHANGING VALUE(R).

R = O1 * O2.

WRITE: / 'Inside subroutine:',

/ 'R=', R, 'RES=', RES.

ENDFORM.

在启动 SAPMZTST 后,输出如下:

Inside subroutine:

R= 12 RES= 0

After subroutine:

RES= 12

在该示例中,从调用程序调用内部子程序 MULTIP。参数 OP1 和 OP2 通过值传递给形式参数 O1

和 O2。输出参数 RES 通过值和结果传递给形式参数 R。通过将 R 和 RES 从子程序内部写到屏

幕上,证明 RES 在 ENDFORM 语句之前未被更改。从子程序中返回之后,其内容已更改。

键入形式参数

要确保子程序的形式参数属于某个类型,可在 FORM 语句中指定该类型。为此,请在 TABLES、 USING 或 CHANGING 后面列表中的形式参数后输入 TYPE 或 LIKE (参见DATA 语句的基本格式 (页 3–14) )。该类型规范可选。

用 PERFORM 调用子程序时,系统检查 PERFORM 语句中实参数的类型是否与分配给形式参数的类型兼容。下表给出了兼容规则。不存在类型转换。如果类型不兼容,系统会在内部子程序调用的语法检查期间输出错误信息,或在外部子程序调用时出现运行错误。

以下兼容规则应用于确定形式参数类型:

确定类型实参数的语法检查

无类型规范

TYPE ANY

系统接受任意类型的实参数。将实参数的所有属性传递给形式参数

TYPE TABLE 系统检查实参数是否为内表。将表格的所有属性和结构从实参数传

参数。

TYPE C、 N、 P 或 X 系统检查实参数的类型是否为 C、 N、 P 或 X。将参数的长度和其

范(对类型 P)从实参数传递给形式参数。

TYPE D、F、 I或T,LIKE ,

TYPE 完全确定这些类型。系统检查实参数的数据类型是否完全与形式参相兼容。

REPORT SAPMZTST.

DATA:

DATE1 TYPE D, DATE2 TYPE T,

STRING1(6) TYPE C, STRING2(8) TYPE C,

NUMBER1 TYPE P DECIMALS 2, NUMBER2 TYPE P,

COUNT1 TYPE I, COUNT2 TYPE I.

PERFORM TYPETEST USING DATE1 STRING1 NUMBER1 COUNT1.

SKIP.

PERFORM TYPETEST USING DATE2 STRING2 NUMBER2 COUNT2.

FORM TYPETEST USING NOW

TXT TYPE C

VALUE(NUM) TYPE P

INT TYPE I.

DATA: T.

DESCRIBE FIELD NOW TYPE T.

WRITE: / 'Type of NOW is', T.

DESCRIBE FIELD TXT LENGTH T.

WRITE: / 'Length of TXT is', T.

DESCRIBE FIELD NUM DECIMALS T.

WRITE: / 'Decimals of NUM are', T.

DESCRIBE FIELD INT TYPE T.

WRITE: / 'Type of INT is', T.

ENDFORM.

在 SAPMZTST 后,输出如下:

TYPE of NOW is D

Length of TXT is 6

Decimals of NUM are 2

Type of INT is I

TYPE of NOW is T

Length of TXT is 8

Decimals of NUM are 0

Type of INT is I

采用不同的实参数,两次调用内部子程序 TYPETEST 。所有实参数和形式参数均兼容,在语法

检查中没有出现错误信息。例如,如果在调用程序中将 COUNT2 声明为 TYPE F 而不是 TYPE I ,

则在语法检查中会报告错误,因为形式参数 INT 是用 TYPE I 指定的。请注意,类型规范不同,

每次调用子程序时,形式参数的类型和属性也可以有所不同。

详细信息,请参见 FORM 的关键字文档。

向子程序传递字段串

如果要向子程序传递字段串,并访问子程序中字段串的组件,则必须指定相应形式参数的类型(参见键入形式参数 (页9) )。这里使用的数据类型必须与字段串类型相同。

对于内部子程序,可以使用 TYPE 或 LIKE 参考要直接传递的字段串的结构。对于外部子程序,还必须在包含子程序的程序中指定结构定义。为此,可以使用下列任何一种:

_ 包含程序

_ 类型组

_ ABAP/4 词典结构

下例就上述内容加以说明:

包含程序

可以在包含程序中定义结构(参见包含程序 (页2) )。该方法适用于这种结构:只用于几个子程序中,并且仅由几个开发者使用。

包含程序 DECLARE:

***INCLUDE DECLARE.

TYPES: BEGIN OF LINE,

NAME(10) TYPE C,

AGE(2) TYPE N,

COUNTRY(3) TYPE C,

END OF LINE.

程序 FORMPOOL 包含程序 DECLARE 和 COMPONENTS 子程序:

PROGRAM FORMPOOL.

INCLUDE DECLARE.

FORM COMPONENTS CHANGING VALUE(PERSON) TYPE LINE.

WRITE: / PERSON-NAME, PERSON-AGE, PERSON-COUNTRY.

PERSON-NAME = 'Mickey'.

PERSON-AGE = '60'.

PERSON-COUNTRY = 'USA'.

ENDFORM.

程序 SAPMZTST 包含程序 DECLARE,并调用子程序 COMPONENTS:

REPORT SAPMZTST.

INCLUDE DECLARE.

DATA WHO TYPE LINE.

WHO-NAME = 'Karl'. WHO-AGE = '10'. WHO-COUNTRY = 'D'.

PERFORM COMPONENTS(FORMPOOL) CHANGING WHO.

WRITE: / WHO-NAME, WHO-AGE, WHO-COUNTRY.

SAPMZTST 随后输出:

KARL 10 D

MICKEY 60 USA

实参数 WHO (具有用户定义的、结构化数据类型 LINE)传递给形式参数 PERSON。形式参数

PERSON 的类型由 TYPE LINE 确定。因为 LINE 是由用户定义的数据类型,因此 PERSON 的类型就

被完全指定。子程序访问并更改 PERSON 的组件。然后返回给调用程序中 WHO 的组件。

类型组

可在类型组中定义结构(参见使用类型组 (页 3–27) )。该方法适用于几个开发者共同工作的大型程序所用的结构中。

DECLA 类型组:

TYPE-POOL DECLA .

TYPES: BEGIN OF DECLA_LINE,

NAME(10) TYPE C,

AGE(2) TYPE N,

COUNTRY(3) TYPE C,

END OF DECLA_LINE.

程序 FORMPOOL 使用 DECLA 类型组,并包含子程序 COMPONENTS 。

PROGRAM FORMPOOL.

TYPE-POOLS DECLA.

FORM COMPONENTS CHANGING VALUE(PERSON) TYPE DECLA_LINE.

WRITE: / PERSON-NAME, PERSON-AGE, PERSON-COUNTRY.

PERSON-NAME = 'Mickey'.

PERSON-AGE = '60'.

PERSON-COUNTRY = 'USA'.

ENDFORM.

程序 SAPMZTST 使用 DECLA 类型组,并调用子程序 COMPONENTS :

REPORT SAPMZTST.

TYPE-POOLS DECLA.

DATA WHO TYPE DECLA_LINE.

WHO-NAME = 'Karl'. WHO-AGE = '10'. WHO-COUNTRY = 'D'.

PERFORM COMPONENTS(FORMPOOL) CHANGING WHO.

WRITE: / WHO-NAME, WHO-AGE, WHO-COUNTRY.

SAPMZTST 随后输出:

KARL 10 D

MICKEY 60 USA

除了类型定义不在包含程序中出现,而在 DECLA 类型组中出现之外,该示例与上例完全一样。

ABAP/4 词典结构

可以使用 ABAP/4 词典中的表格结构。该方法始终可选,因为总能访问 ABAP/4 词典结构。

程序 FORMPOOL 包含子程序 COMPONENTS :

PROGRAM FORMPOOL.

FORM COMPONENTS CHANGING VALUE(CITIES) LIKE SPFLI.

WRITE: / CITIES-CITYFROM, CITIES-CITYTO.

CITIES-CITYFROM = 'New York'.

CITIES-CITYTO = 'San Francisco'.

ENDFORM.

程序 SAPMZTST 调用子程序 COMPONENTS:

REPORT SAPMZTST.

DATA FLIGHT LIKE SPFLI.

FLIGHT-CITYFROM = 'Berlin'. FLIGHT-CITYTO = 'London'.

PERFORM COMPONENTS(FORMPOOL) CHANGING FLIGHT.

WRITE: / FLIGHT-CITYFROM, FLIGHT-CITYTO.

SAPMZTST 随后输出:

Berlin London

New York San Francisco

在子程序 COMPONENTS 中,用 LIKE SPFLI 确定形式参数 CITIES 的类型。在 ABAP/4 词典中,CITIES

结构与表格 SPFLI 相同。在程序 SAPMZTST 中,使用相同结构对字段串 FLIGHT 加以说明,然后

填充和传递给子程序 COMPONENTS 的结构 CITIES 组件。该子程序处理组件并将其传递给调用程

序。

向子程序传递内表

用USING 和 CHANGING 传递

在 FORM 和 PERFORM 语句中,可以将内表当作 USING 或 CHANGING 后面列表中的参数传递。如果要访问内表组件,则必须指定相应形式参数的类型(参见键入形式参数 (页9) )。否则,只能在子程序中执行行操作。同时还必须区分有表头行或无表头行的内表。对于有表头行的内表,必须在表格名之后用方括号([])指定表格体,以便与表头行区分开(参见访问内表 (页 8–4) )。

对于内部子程序,可以用 TYPE 或 LIKE 参考要直接传递的内表。对于外部子程序,还必须在包含子程序的程序中定义结构。为此,请按照定义字段串结构的方法进行(参见向子程序传递字段串 (页10) )。

PROGRAM SAPMZTST.

DATA: BEGIN OF LINE,

COL1 TYPE I,

COL2 TYPE I,

END OF LINE.

DATA ITAB LIKE LINE OCCURS 10.

PERFORM FILL CHANGING ITAB.

PERFORM OUT USING ITAB.

FORM FILL CHANGING F_ITAB LIKE ITAB.

DATA F_LINE LIKE LINE OF F_ITAB.

DO 3 TIMES.

F_LINE-COL1 = SY-INDEX.

F_LINE-COL2 = SY-INDEX ** 2.

APPEND F_LINE TO F_ITAB.

ENDDO.

ENDFORM.

FORM OUT USING VALUE(F_ITAB) LIKE ITAB.

DATA F_LINE LIKE LINE OF F_ITAB.

LOOP AT F_ITAB INTO F_LINE.

WRITE: / F_LINE-COL1, F_LINE-COL2.

ENDLOOP.

ENDFORM.

启动 SAPMZTST 后,输出如下:

1 1

2 4

3 9

在该示例中,定义并调用了两个子程序: FILL 和 OUT。无表头行的内表 ITAB 传递给子程序。

通过参考值传递给 FILL,通过值传递给 OUT。请注意,在两个子程序中都将工作域 F_LINE 创

建为局部数据对象(有关局部字段的信息,参见在子程序中定义局部数据类型和对象 (页1

3) )。如果 ITAB 为有表头行的表格,则在 PERFORM 和 FORM 中必须用 ITAB[] 代替 ITAB。

用 TABLES 传递

在 FORM 和 PERFORM 语句中,可以将所有内表当作 TABLES 后面列表中的参数进行传递。如果要在子程序中访问表格行的组件,则必须指定形式参数的数据类型(参见向子程序传递字段串 (页10) )。否则,只能执行整行操作。由 TABLES 传递的内表总是通过参考值调用。

如果传递有表头行的内表,则将表格体和表格工作域传递给子程序。如果传递无表头行的内表,则在子程序中自动创建作为局部数据对象的表头行(关于局部字段的详细信息,参见在子程序中定义局部数据类型和对象 (页13) )。

PROGRAM SAPMZTST.

TYPES: BEGIN OF LINE,

COL1 TYPE I,

COL2 TYPE I,

END OF LINE.

DATA: ITAB TYPE LINE OCCURS 10 WITH HEADER LINE,

JTAB TYPE LINE OCCURS 10.

PERFORM FILL TABLES ITAB.

MOVE ITAB[] TO JTAB.

PERFORM OUT TABLES JTAB.

FORM FILL TABLES F_ITAB LIKE ITAB[].

DO 3 TIMES.

F_ITAB-COL1 = SY-INDEX.

F_ITAB-COL2 = SY-INDEX ** 2.

APPEND F_ITAB.

ENDDO.

ENDFORM.

FORM OUT TABLES F_ITAB LIKE JTAB.

LOOP AT F_ITAB.

WRITE: / F_ITAB-COL1, F_ITAB-COL2.

ENDLOOP.

ENDFORM.

启动 SAPMZTST 后,输出如下:

1 1

2 4

3 9

在该示例中,内表 ITAB 有表头行,而内表 JTAB 无表头行。 ITAB 被传递给子程序 FILL,从中

使用表格工作域 F_ITAB 进行填充。在调用程序中,将 ITAB 的表格体复制到 JTAB 后,JTAB 被

传递给子程序 OUT。请注意,在这种情况下,将无表头行的实表格传递给有表头行的形式表格,

并在子程序中使用了表格工作域 F_ITAB。

在子程序中定义局部数据类型和对象

局部数据类型和对象仅在声明它们的过程中出现。对于子程序,可以区分

_ 仅在执行子程序时才存在的动态数据类型和对象

_ 存在于子程序之外的静态数据对象。在下次调用同一子程序之前,该数据对象一直调用和保留其值。

_ 显式定义的局部数据对象,可以用于保留全局数据对象值

特殊种类的局部数据是局部数据堆栈上的全局数据副本。使用字段符号定义和访问(关于该主题的详细信息,参见分配全局字段的局部副本 (页 10–16) )。

定义动态局部数据类型和对象

可以用 TYPES 和 DATA 语句,按照创建数据对象和数据类型 (页 3–12) 中的说明,在子程序内创建局部数据类型和数据对象。为每个子程序调用新近定义的这些类型和对象将在退出子程序时删除。

每个子程序均有自己的局域命名空间。如果用与全局数据类型或对象相同的名称定义局部数据类型或对象,则不能在子程序中访问全局数据类型或对象。局部数据类型或数据对象会隐藏同名全局数据类型或对象。这意味着,如果在子程序中使用某个数据类型或对象名,则总定址局部声明的对象(如果存在),否则,定址全局声明的对象。

PROGRAM SAPMZTST.

TYPES WORD(10) TYPE C.

DATA TEXT TYPE WORD.

TEXT = '1234567890'. WRITE / TEXT.

PERFORM DATATEST.

WRITE / TEXT.

FORM DATATEST.

TYPES WORD(5) TYPE C.

DATA TEXT TYPE WORD.

TEXT = 'ABCDEFGHJK'. WRITE / TEXT.

ENDFORM.

启动 SAPMZTST 后,输出如下:

1234567890

ABCDE

1234567890

该示例中,类型为 WORD 的数据类型 WORD 以及数据对象 TEXT 都在调用程序中给出全局声明。

在给 TEXT 分配值并将其写到屏幕上之后,调用内部子程序 DATATEST。在子程序内部,类型

为 WORD 的数据类型 WORD 以及数据对象 TEXT 都给出局部声明。它们隐藏全局类型和对象。仅

在退出子程序后,全局定义才恢复有效。

如果要避免隐藏全局数据类型和对象,则必须给局部类型和对象分配不同的名称。例如,所有局部名称都以前缀‘ F_’开头。

定义静态局部数据对象

如果想在退出子程序后保留局部数据对象之值,必须使用 STATICS 语句而非 DATA 语句进行声明(参见STATICS 语句 (页 3–20) )。使用 STATICS 声明已全局定义、但仅在定义它的子程序中局部可见的数据对象。

PROGRAM SAPMZTST.

PERFORM DATATEST1.

PERFORM DATATEST1.

SKIP.

PERFORM DATATEST2.

PERFORM DATATEST2.

FORM DATATEST1.

TYPES F_WORD(5) TYPE C.

DATA F_TEXT TYPE F_WORD VALUE 'INIT'.

WRITE F_TEXT.

F_TEXT = '12345'.

WRITE F_TEXT.

ENDFORM.

FORM DATATEST2.

TYPES F_WORD(5) TYPE C.

STATICS F_TEXT TYPE F_WORD VALUE 'INIT'.

WRITE F_TEXT.

F_TEXT = 'ABCDE'.

WRITE F_TEXT.

ENDFORM.

启动 SAPMZTST 后,输出如下:

INIT 12345 INIT 12345

INIT ABCDE ABCDE ABCDE

在该示例中,定义了两个类似的子程序:DATATEST1 和 DATATEST2。在 DATATEST2 中,用 STATICS

语句而不是 DATA 语句声明数据对象 F_TEXT。每次调用 DATATEST1 期间,F_TEXT 都被再次初始

化,但都为 DATATEST2 保留值。STATICS 语句的 VALUE 选项仅在第一次调用 DATATEST2 时起作用。

显式定义局部数据对象

要避免全局数据对象值在子程序内被更改,请使用 LOCAL 语句,用法如下:

语法

LOCAL .

只能在 FORM 语句和 ENDFORM 语句之间使用该语句。对于 LOCAL ,可以保存无法被子程序内的数据声明隐藏的全局数据对象值(参见定义动态局部数据类型和对象 (页13) )。

例如,在子程序内,用 TABLES 语句(参见TABLES 语句 (页 3–20) )无法声明由另一个 TABLES 语句定义的表格工作域。如果想局部使用表格工作域,但保留其在子程序外部的内容,则必须使用 LOCAL 语句。

关于该语句的详细信息,参见 LOCAL 关键字文档。

如下所示,假定程序 FORMPOOL 包含两个子程序 TABTEST1 和 TABTEST2:

PROGRAM FORMPOOL.

TABLES SFLIGHT.

FORM TABTEST1.

SFLIGHT-PLANETYPE = 'A310'.

SFLIGHT-PRICE = '150.00'.

WRITE: / SFLIGHT-PLANETYPE, SFLIGHT-PRICE.

ENDFORM.

FORM TABTEST2.

LOCAL SFLIGHT.

SFLIGHT-PLANETYPE = 'B747'.

SFLIGHT-PRICE = '500.00'.

WRITE: / SFLIGHT-PLANETYPE, SFLIGHT-PRICE.

ENDFORM.

如下所示,假定程序 SAPMZTST 调用 TABTEST1 和 TABTEST2:

PROGRAM SAPMZTST.

TABLES SFLIGHT.

PERFORM TABTEST1(FORMPOOL).

WRITE: / SFLIGHT-PLANETYPE, SFLIGHT-PRICE.

PERFORM TABTEST2(FORMPOOL).

WRITE: / SFLIGHT-PLANETYPE, SFLIGHT-PRICE.

启动 SAPMZTST 后,输出如下:

A310 150.00

A310 150.00

B747 500.00

A310 150.00

该示例中,通过参照 ABAP/4 词典结构 SFLIGHT 创建了一个表格工作域。在 TABTEST1 和

TABTEST2 中,给表格工作域 SFLIGHT 指定不同的值。TABTEST1 中指定的值全局有效,而

TABTEST2 中指定的值仅局部有效。

中断子程序

要中断子程序,所用方法与使用 EXIT 或 CHECK 语句中断循环的方式类似(参见终止循环 (页 7–20) )。

_ 用 EXIT 无条件中断子程序。

_ 用 CHECK 根据条件中断子程序。

如果用 EXIT 或 CHECK 中断子程序,则系统在该点中断子程序、传递参数,并继续 PERFORM 语句后的语句。

在 FORM 例程中,如果在循环内使用 EXIT 或 CHECK,则循环的中断条件适用,说明参见终止

循环 (页 7–20) 。中断循环时, EXIT 语句和 CHECK 语句的工作方式不同,但中断子程序时,

方式相同。

无条件中断子程序

要无条件中断子程序,请使用 EXIT 语句,用法如下:

语法

EXIT.

执行 EXIT 语句后,系统立即退出子程序,进行 PERFORM 语句后的处理。

PROGRAM SAPMZTST.

PERFORM TERMINATE.

WRITE 'The End'.

FORM TERMINATE.

WRITE '1'.

WRITE '2'.

WRITE '3'.

EXIT.

WRITE '4'.

ENDFORM.

启动 SAPMZTST 后,输出如下:

1 2 3 The End

在该示例中,子程序 TERMINATE 在第三个 WRITE 语句后中断。

有条件地中断子程序

要有条件中断子程序,请使用 CHECK 语句,用法如下:

语法

CHECK .

如果条件不满足,则系统退出子程序,并开始 PERFORM 语句后的处理。对于 ,可以使用编程逻辑表达式 (页 7–3) .中说明的任意逻辑表达式。

PROGRAM SAPMZTST.

DATA: NUM1 TYPE I,

NUM2 TYPE I,

RES TYPE P DECIMALS 2.

NUM1 = 3. NUM2 = 4.

PERFORM DIVIDE USING NUM1 NUM2 CHANGING RES.

NUM1 = 5. NUM2 = 0.

PERFORM DIVIDE USING NUM1 NUM2 CHANGING RES.

NUM1 = 2. NUM2 = 3.

PERFORM DIVIDE USING NUM1 NUM2 CHANGING RES.

FORM DIVIDE USING N1 N2 CHANGING R.

CHECK N2 NE 0.

R = N1 / N2.

WRITE: / N1, '/', N2, '=', R.

ENDFORM.

启动 SAPMZTST 后,输出如下:

3 /

4 = 0.75

2 /

3 = 0.67

该示例中,由于 N2值为零,故系统在 CHECK 语句后的第二次调用期间,退出子程序 DIVIDE。

功能模块

功能模块是存储在中央库内的特殊外部子程序。R/3 系统提供大量预定义的功能模块,可以从 ABAP/4 程序中进行调用,而且可以创建自己的功能模块。

功能模块和一般 ABAP/4 子程序的显著差异在于一个明确定义的、用于与功能模块进行数据传递的接口。对于功能模块,不能将数据声明为公共部分。对于 ABAP/4 词典表格,调用程序和被调用的功能模块都有单独的工作域。

接口有助于输入和输出参数的传递并将其标准化。例如,可以给功能模块的输入值分配缺省值。可以决定通过值还是参考值进行数据传递(关于进行数据传递的详细信息,参见通过参数进行数据传递 (页7) )。接口也支持例外处理。借助例外,可以处理可能发生的错误。

用 ABAP/4 工作台调用、创建和维护功能模块。例如,通过从 ABAP/4 程序外的事务屏幕调用功能模块,可以对其进行测试。

在功能库中,可以将多个功能模块组合成功能组。因为可以定义功能组中所有功能模块都能访问的全局数据,因此,在一个功能组中包含操作相同数据(如内表)的功能模块比较合理。

下列主题就现有功能模块的使用原则以及如何创建新的功能模块等加以说明。关于功能模块和功能库的详细信息,参见文档工作台工具 (页Error! Not a valid link.).。

使用现有功能模块

下面主题说明,

调用可用功能模块列表

要获得可用功能模块列表,请执行以下操作:

1. 通过“ABAP/4 开发工作台”屏幕,在应用工具条中,选择“开发 -> 功能库”,或者选择“功

能库”。

显示“功能库:维护功能模块”屏幕。

2. 选择“查找”。

显示“ABAP/4 资源库信息系统:功能模块”屏幕。

3. 输入所有已知的搜索标准(例如string_sp*),并选择“输入”。

显示符合输入标准的所有功能模块列表。

4. 在该列表中,双击相应的复选框,选择所需的功能模块。

例如:

- 要更改功能模块,选择“更改”(关于该主题的详细信息,参见文档ABAP/4 工作台工具(页Error! Not a valid link.) )。

- 要显示关于功能模块的文档,选择“显示”(关于该主题的详细信息,参见显示功能模块的属性 (页17) )。

- 要测试功能模块,选择“执行”(关于该主题的详细信息,参见测试功能模块 (页17) )。

显示功能模块的属性

要显示功能模块的属性,请将功能模块名输入到“功能库:维护功能模块”屏幕。例如:

然后,选择要显示属性的单选按钮,并选择“显示”。如果要更改属性,可以在“ABAP/4 功能库:初始屏幕”上选择“更改”,或在下面的屏幕上选择“显示 <-> 更改”。

例如,重要属性有:

文档

“文档”屏幕显示如下:

文档就功能模块的目的加以说明,列出与模块进行数据传递的参数以及例外。参数类型 I 的

参数为输入参数,用于向功能模块传递数据。参数类型 E 的参数为输出参数,用于从功能模块

向调用函数传递数据。例外主要对功能模块中可能出现的错误情况进行说明。

接口

选择“输入 /输出参数接口”之后,就会出现下列屏幕:

选择“表格参数/例外接口”之后,就会出现下列屏幕:

上述屏幕列出功能模块中用于数据传递的所有形式参数。传递参数的过程与子程序的过程类似(参见通过参数进行数据传递 (页7) )。如果选择“参考值”复选框,就通过参考值传递参数。否则,如果不选择该复选框,就通过值传递参数。

_ 输入参数与子程序的形式输入参数相对应。用于将数据从调用程序传递到功能模块。即使输入参数是通过参考值传递的,也不能改写。

_ 输出参数与子程序的形式输出参数相对应。用于将数据从功能模块传递回调用程序。

_ 通过参考值或值和结果(参见通过值和结果进行传递 (页8) )传递更改参数。更改参数即是输入参数又是输出参数。更改传递给功能模块的值,并将其返回给调用程序。

_ 表格参数是内表。内表处理方式与更改参数一样,总是通过参考值传递。

_ 例外用于处理功能模块中可能发生错误的情况。调用程序检查是否发生了错误,然后采取相应的措施。

输入参数、更改参数和表格参数是“可选”项。这就是说,在调用程序中调用函数时,可以忽略相应的实参数。如果参数可选,并且不指定实参数,则可以指定在功能模块中使用的缺省值。输出参数总是可选。

与子程序一样(参见键入形式参数 (页9) ),可以在字段“参考值类型”中指定形式参数的数据类型。在字段“参考值结构”中,可以指定 ABAP/4 词典参考结构或字段。然后,在运行时,系统对照结构或字段检查当前参数。

源代码

ABAP/4 编辑器屏幕显示功能模块的 ABAP/4 源代码。可以按照显示或更改程序 (页 1–7) 中说明的处理正常ABAP/4 程序的方式,处理源代码。

测试功能模块

可以选择“单个测试”,通过“功能库:维护功能模块”屏幕对功能模块进行测试,不用从 ABAP/4 程序中调用。在“测试功能模块”屏幕上,可以为输入参数分配值。

选择“执行”后,出现“功能模块:结果屏幕”:

随后,可以发现功能模块 STRING_SPLIT 的工作方式与 ABAP/4 关键字 SPLIT (拆分字符串 (页 6–33) )相同。在DELIMITER "-" 处,将输入参数STRING "FUNCTION-MODULE" 的值分为“ FUNCTION”和“MODULE”,并将其分配给输出参数 HEAD 和 TAIL。请注意,STRING 的内容改为大写字母,因为“测试功能模块”屏幕上的“大写/小写”复选框空着。

调用功能模块

要从 ABAP/4 程序调用功能模块,请使用 CALL 语句,用法如下:

语法

CALL FUNCTION

[EXPORTING F1 = a1 .... f n = a n]

[IMPORTING F1 = a1 .... f n = a n]

[CHANGING F1 = a1 .... f n = a n]

[TABLES F1 = a1 .... f n = a n]

[EXCEPTIONS e1 = r1 .... e n = r n [OTHERS = r o]].

可以将功能模块 的名称指定为文字或变量。通过将实参数显式指定给 EXPORTING、 IMPORTING、 TABLES 或 CHANGING 选项后面列表中的形式参数,与功能模块之间进行参数传递。

分配总是有以下格式:

=

_ EXPORTING 选项允许将实参数 a i传递给形式输入参数 f i。在功能模块中,必须将形式参数声明为输入参数。

_ IMPORTING 选项允许将形式输出参数 f i传递给实参数 a i。在功能模块中,必须将形式参数声明为输出参数。

_ CHANGING 选项允许将实参数 a i传递给形式参数 f i,并在处理功能模块后,系统将(更改过的)形式参数 f i传递回实参数 a i。在功能模块中,必须将形式参数声明为更改参数。

_ TABLES 选项允许在实参数和形式参数间传递表格。借助该选项,内表总是通过参考值传递。EXPORTING、 IMPORTING 和 CHANGING 选项的参数可以是任意类型的数据对象。这些选项的功能类似于子程序的FORM 和 PERFORM 语句中(参见通过参数进行数据传递 (页7) )的 USING 和 CHANGING 选项。TABLES 选项的参数必须为内表。TABLES 选项对应于 FORM 和 PERFORM 语句的 TABLES 选项(参见向子程序传递内表 (页12) )。用 EXCEPTIONS 选项,可以处理功能模块处理过程中发生的例外。例外是功能模块的特殊参数。有关如何定义和出现例外的内容,创建和编写功能模块 (页18) .中有专门说明。如果出现 e i例外,则系统停止执行功能模块,并且不将任何值从功能模块传递给程序,通过参考值传递的值例外。如果在 EXCEPTION 选项中指定了e i,则调用程序通过将 r i分配给 SY-SUBRC 来处理例外。必须将 r i指定为数字文字。可以使用 EXCEPTION 列表中的 OTHERS 处理列表中没有显式指定的所有例外,并且可将同一数值 r i用于多个例外。

通过 ABAP/4 编辑器屏幕选择“编辑 -> 插入语句”是在程序中包括功能模块调用的最简单方法。可以在出现的对话窗口中选择“调用函数”,并输入要调用的功能模块名。

然后选择“回车”,则系统将 CALL 语句(包含指定功能模块的所有可能选项)插入程序代码中。

对于功能模块 STRING-SPLIT,插入的代码如下显示:

CALL FUNCTION 'STRING_SPLIT'

EXPORTING

DELIMITER =

STRING =

IMPORTING

HEAD =

TAIL =

EXCEPTIONS

NOT_FOUND = 01

NOT_VALID = 02

TOO_LONG = 03

TOO_SMALL = 04.

现在,可以按需要更改该代码。

REPORT SAPMZTST.

DATA: TEXT(20),

FRONT(20),

END(20).

TEXT = 'Testing:String_Split'.

CALL FUNCTION 'STRING_SPLIT'

EXPORTING DELIMITER = ':' STRING = TEXT

IMPORTING HEAD = FRONT TAIL = END

EXCEPTIONS NOT_FOUND = 1 OTHERS = 2.

CASE SY-SUBRC.

WHEN 1. WRITE / 'Not found'.

WHEN 2. WRITE / 'Other errors'.

WHEN OTHERS. WRITE: / FRONT, / END.

ENDCASE.

启动 SAPMZTST 后,输出如下:

Testing

String_Split.

该示例中,调用了功能模块 STRING_SPLIT。通过使用 EXPORTING 选项,将实参数“:”和 TEXT

传递给形式参数 DELIMITER 和 STRING。如果这一过程成功完成,则通过 IMPORTING 选项将形式

参数 HEAD 和 TAIL 传递给实参数 FRONT 和 END。

如果 STRING_SPLIT 中出现 NOT_FOUND 例外,则将 SY-SUBRC 的值设置为 1。如果出现另一个例外,

则将 SY-SUBRC 的值设置为 2。用 CASE 语句处理该例外。例如,如果将某个 TEXT 中不包括的文

字分配给 EXPORTING 列表中的形式参数 DELIMITER,则输出:

Not found

创建和编写功能模块

下列主题说明如何创建简单功能模块。关于该主题的详细信息,参见文档工作台工具 (页

Error! Not a valid link.) 。

创建功能模块

要创建新的功能模块,请执行以下操作:

1. 通过“功能库:维护功能模块”屏幕,输入功能模块名并选择“创建”。

2. 出现“功能模块创建:管理”屏幕。必须在该屏幕上为模块输入功能组 。也可以为模

块输入一段短文本。

属于某个功能组的所有功能模块都被组合到一个 ABAP/4 程序 SAPL中。通过在“功能

库:维护功能模块”屏幕上选择“转向 -> 功能组 -> 创建组”,创建功能模块(参见文档ABAP/4

工作台工具 (页Error! Not a valid link.) )。

然后,选择“保存”保存功能模块,并选择“返回”退出屏幕。

3. 选择“输入/输出参数接口”单选按钮,通过“功能库:维护功能模块”屏幕定义接口,然

后选择“更改”。在“功能模块更改:输入/输出参数”屏幕上,键入输入、输出和更改参

数。

要输入例外,请选择“转向 -> 表格/例外接口”。通过“功能模块更改:表格参数/例外”

屏幕,可以输入例外名称。

选择“保存”保存接口,并选择“返回”退出屏幕。

4. 选定“源代码”单选按钮,通过“功能库:维护功能模块”屏幕输入“源代码”,然后选择

“更改”。出现 ABAP/4 编辑器,其中包含您的程序。定义的参数以注释模式出现。

现在,可以输入并保存程序代码(参见编写功能模块 (页19) )

5. 选择“功能模块 -> 激活”,通过“功能库:维护功能模块”屏幕功能模块,然后按照测试功

能模块 (页17) 中的说明进行测试。

编写功能模块

要编写功能模块,必须如下在 FUNCTION 和 ENDFUNCTION 语句间包含语句:

语法

FUNCTION .

ENDFUNCTION.

要输入程序代码,方法与正常子程序一样,但下列情况例外:

功能模块中的数据处理

不必在功能模块的源代码中声明输出和输入参数。系统在 INCLUDE 程序中执行该任务。将已定义的参数列表当作注释行插入到源代码中(参见创建功能模块 (页19) 中的步骤 4)中。

与子程序一样,可以在功能模块中声明局部数据类型(参见在子程序中定义局部数据类型和对象 (页13) )。

选择“全局数据”,通过“功能库:维护功能模块”屏幕为 INCLUDE 程序 LTOP 打开 ABAP/4 编辑器。INCLUDE 程序被作为第一个语句包含到程序 SAPL 中。 SAPL 是功能组 (由该组的所有功能模块组成)的主程序。单个功能模块又包含在 INCLUDE 程序中(参见文档工作台工具 (页Error! Not a valid link.))。

可以用 TYPES 和 DATA 语句将数据声明写入 LTOP。该数据对功能组的所有模块是全局数据,对该组是局部数据。调用第一个模块之后,系统立即创建他们,并始终保留最后一次模块调用的值。

从功能模块调用子程序

可以从功能模块调用不同的子程序。

_ 可以在模块的 ENDFUNCTION 语句后面直接写入内部子程序的程序代码。可以从功能组的所有模块中调用该子程序。但是,要想更清晰,则应该仅从功能模块(在该模块后写子程序)调

用该子程序。

_ 要创建可以从功能组 的所有模块调用的内部子程序,请使用特殊的 INCLUDE 程序LF 。在“功能库:维护功能模块”屏幕上选择“主程序”后,在主程序 SAPL

中双击 INCLUDE 程序名,则可以打开这些程序。关于该主题的详细信息,参见文档工作台工具

(页Error! Not a valid link.) 。

_ 可以调用任意外部子程序。

产生例外

为产生例外, ABAP/4 提供两个仅能在功能模块中使用的语句:

语法

RAISE .

MESSAGE ..... RAISING .

这些语句的效果依赖于是调用程序自己处理例外,还是将例外留给系统处理。如果在 CALL FUNCTION 语句的EXCEPTION 选项中指定例外的名称 或 OTHERS(参见调用功能模块 (页17) ),则调用程序自己处理例外。

如果系统处理例外,

_ RAISE 语句中断程序,并切换到调试模式

_ MESSAGE ..... RAISING 语句显示一条信息。系统按照信息类型继续处理。在 INCLUDE 程序LTOP 的第一个语句中,必须指定 MESSAGE-ID。关于在报表中处理信息的信息,参见列

表中的消息 (页Error! Not a valid link.) ,关于在事物编程中处理信息的信息,参见处理

错误和消息 (页Error! Not a valid link.) .。

如果调用程序自己处理例外,两个语句都直接将程序的控制权返回给调用程序,并且系统不将任何数据从功能模块传递给程序,通过参考值调用的参数除外。MESSAGE ..... RAISING 语句不显示任何信息,但填充在程序中可以访问的下列字段:

_ SY-MSGID (信息标识符)

_ SY-MSGTY (信息类型)

_ SY-MSGNO (信息号码)

_ SY-MSGV1 到 SY-MSGV4(字段 的内容,包含在信息中)

(参见 MESSAGE 的关键字文档)

假定有下面的功能模块:

FUNCTION MY_DIVIDE.

*"----------------------------------------------------------

*" Local interface:

*" IMPORTING

*" N1

*" N2

*" EXPORTING

*" R

*" EXCEPTIONS

*" DIV_ZERO

*"----------------------------------------------------------

IF N2 EQ 0.

RAISE DIV_ZERO.

ELSE.

R = N1 / N2.

ENDIF.

ENDFUNCTION.

该功能模块中,如果 N2 不等于零,则用 N1 除以 N2。否则,产生例外 DIV_ZERO。

假定下面的程序 SAPMZTST 调用 MY_DIVIDE:

REPORT SAPMZTST.

DATA: RES TYPE P DECIMALS 2.

CALL FUNCTION 'MY_DIVIDE'

EXPORTING N1 = 5 N2 = 4

IMPORTING R = RES

EXCEPTIONS DIV_ZERO = 11.

IF SY-SUBRC EQ 0.

WRITE: / 'Result =', RES.

ELSE.

WRITE 'Division by zero'.

ENDIF.

启动 SAPMZTST 后,输出如下:

RESULT = 1.25

如果在 EXPORTING 列表中用 N2 = 0 代替 N2 =, SAPMZTST 通过将 11 传递给 SY-SUBRC,处理例

外 DIV_ZERO,输出如下:

Division by zero

字符串处理

实验1 字符串处理 1.1 实验内容 1. 下面程序输出有无问题,问题在什么地方 #include void main(){ char a[]=“\0”; 空字符串 puts(a); } 问题:____空____________________ 2. 写出程序运行结果,并运行证实 #include void main(){ char a[20]="abcdefgh"; 出现了两个结束标志 a[4]=’\0’; 默认第一个 puts(a); } 结果:_____abcd______________ 3. 指出下面程序中的错误 #include void main(){ char q[8]; strcpy(q, "love all "); printf("%s\n",q); } 4. 写出下面程序的功能,并运行验证。 #include #include void main(){ char str[100],t; int i,len; char t, *p1, *p2; scanf("%s",str); len=strlen(str); for(i=0;i

程序。 #include "stdio.h" void main(){ char a[100]; int i; gets(a); for(i=0;__a[I]!=0 ____;++i); 没有循环体,循环体为空printf("%d\n",i); }

最新七年级下册英语语法重点归纳整理

七年级下册英语语法重点归纳整理 Unit 1 Where’s your pen pal from? 一.短语: 1 .be from = come from 来自于---- 2. live in 居住在--- 3. on weekends 在周末 4 .write to sb = write a letter to sb 给某人写信;写信给某人 5 .in the world 在世界上in China 在中国 6.pen pal 笔友14 years old 14岁favorite subject 最喜欢的科目 7.the United States 美国the United Kingdom 英国New York 纽约 8.speak English 讲英语like and dislike 爱憎 9.go to the movies 去看电影play sports 做运动 二.重点句式: 1 Where’s your pen pal from? = Where does your pen pal from/ 2 Where does he live? 3 What language(s) does he speak? 4 I want a pen pal in China. 5 I can speak English and a little French. 6 Please write and tell me about yourself. 7 Can you write to me soon? 8 I like going to the movies with my friends and playing sports. Unit 2 Where’s the post office?

C字符串处理函数全

strcpy(char destination[], const char source[]); strcpy:将字符串source拷贝到字符串destination中。 strcpy函数应用举例 原型:strcpy(char destination[], const char source[]); 功能:将字符串source拷贝到字符串destination中 例程: #include #include void main(void) { char str1[10] = { "TsinghuaOK"}; char str2[10] = { "Computer"}; cout < #include void main(void) { char str1[10] = { "Tsinghua "}; char str2[10] = { "Computer"}; cout <

字符串处理

字符串处理 B.基本题(SC6_5B.cpp) 【题目描述】 在主字符串中删除所有子字符串。打开SC6_5B.cpp文件,完成程序的编写。 【输入】 输入文件SC6_5B.in有2行,第1行是主字符串,第2行是子字符串。 【输出】 输出文件SC6_5B.out有1行,即删除所有子字符串后的主字符串。 【输入输出样例1】 2】 【输入输出样例 0≤字符串长度≤1000。 Code: #include "stdio.h" #include "string.h" const int N0=1000; char *index( char *s, char *sub )//在s中查找sub,找到返回首字符地址,找不到返回空{ int i=0, j=0; char *p=sub; if( *sub=='\0' )return NULL; //****************************************** for(i=0; i+strlen(sub)-1

} return NULL; //========================================== } int main() { char s[N0+1],sub[N0+1], *p, *q; int sublen; //freopen( "sc6_5b.in", "r", stdin); //freopen( "sc6_5b.out", "w", stdout); gets(s); gets(sub); sublen=strlen( sub ); while( p=index( s, sub ) ) { q=p+sublen; while( *p++=*q++ ); //在s中p的位置删除sub } puts(s); return 0; } C.拓展题(SC6_5C.cpp) 【题目描述】 输入3行字符串,分别是s字符串, t字符串和r字符串。如果s字符串中有包含t字符串,则用r字符串替换之。例如:s=“12aaabc3aaaaaabc#$%aaabc”,t=“aaabc”,r=“abc”,将s中的“aaabc”替换成“abc”之后,s=“12abc3aabc#$%abc”。输出替换之后的s字符串。打开SC6_5C.cpp文件,完成程序的编写。 【输入】 输入文件SC6_5C.in包含有3行字符串,分别是s字符串, t字符串和r字符串。 【输出】 输出文件SC6_5C.out将s字符串中包含的t字符串,用r字符串替换之,输出替换之后的s字符串。 0≤字符串长度≤1000。 Code:

英语虚拟语气语法归纳总结

虚拟语气: 表示说的话不是事实,不可能发生或者说可能性很小的情况,表达一种愿望、建议、假设。 if were/did, would do if had done, would have done if were to do/should do, would do 举例: If I were you, I would do nothing about it. If you had taken your teacher’s advice, you wouldn’t have made such a mistake. If it were to/ should rain tomorrow(表示降水率很低),they wouldn’t go shopping. 附注: 虚拟语气,条件状从倒装 状语从句中,去掉if,提前were/ had/ should 如:If I were you, I would give up. →Were I you, I would give up If you had taken the advice, you would have…. →Had you taken the advice, you would have… If the world shou ld come to an end,…… →Should the world come to an end…… 另外,without, but for, otherwise构成的条件状语从句中,也有含蓄的虚拟语气But for the popularization of electricity, we would lead a whole different life today. (popularization 普及,publicity 宣传) Without your help, I would have failed. We’ll go earlier, otherwise we wouldn’t get a seat.(表示可能性小)

java 字符串常用函数及其用法

java中的字符串也是一连串的字符。但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理。将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。下面是一些使用频率比较高的函数及其相关说明。 String相关函数 1)substring() 它有两种形式,第一种是:String substring(int startIndex) 第二种是:String substring(int startIndex,int endIndex) 2)concat() 连接两个字符串 例:String s="Welcome to "; String t=s.concat("AnHui"); 3)replace() 替换 它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下: String replace(char original,char replacement) 例如:String s=”Hello”.replace(’l',’w'); 第二种形式是用一个字符序列替换另一个字符序列,形式如下: String replace(CharSequence original,CharSequence replacement) 4)trim() 去掉起始和结尾的空格 5)valueOf() 转换为字符串 6)toLowerCase() 转换为小写 7)toUpperCase() 转换为大写 8)length() 取得字符串的长度 例:char chars[]={’a',’b’.’c'}; String s=new String(chars); int len=s.length(); 9)charAt() 截取一个字符 例:char ch; ch=”abc”.charAt(1); 返回值为’b’ 10)getChars() 截取多个字符 void getChars(int sourceStart,int sourceEnd,char target[],int targetStart) sourceStart 指定了子串开始字符的下标 sourceEnd 指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。

中考英语语法点整理

中考英语语法讲解资料及练习目录 第1讲:名词...................................................................................................1-3 第2讲:代词....................................................................................................3-5 第3讲:形容词.................................................................................................5-7 第4讲:副词....................................................................................................7-10 第5讲:动词..................................................................................................10-12 第6讲:不定式..............................................................................................12-13 第7讲介词....................................................................................................13-17 第8讲:连词..................................................................................................17-21 第9讲:时态(一) (22) 第10讲:时态(二).......................................................................................22-28 第11讲:被动语态........................................................................................28-30 第12讲:句子种类(一) (30) 第13讲:句子种类(二)............................................................................30-32 第14讲:宾语从句........................................................................................32-33 第15讲:状语从句........................................................................................33-35 第16讲:就近原则........................................................................................35-36

八年级英语语法归纳整理

八年级英语语法归纳整理(下册) Topic1 一. 重点词汇 ( 一 ) 词形转换: 1.discuss(名词) discussion 2.queen(对应词) king https://www.doczj.com/doc/c06508274.html,fortable(名词) comfort 4.safely (形容词) safe (名词) safety ( 二 ) 词的辨析 1. find out / look for / find 2. cost / pay for / spend on 3. other /else 4. raise /rise 5.each /every 6.exciting / excited (三)重点词组: 1.go on a visit to 去……旅行 2. make the decision 做决定 3.bring back 带回 4.go on a field trip 去野外旅行 5.decide on (upon) sth 对某事做出决定 6 see the sunrise 看日出 7. make a reservation 预订 8. come up with 想出(主意) 9. look forward to (doing) sth 期望 10. pay for 支付;赔偿 11. raise money 筹钱 12. book a ticket 订票 13. make a room for sb 为……订房间 14. have a wonderful time 玩得愉快 15. in the daytime 在白天 16. a two-day visit 为期两天的旅行 17.find out 查出

C程序优化方案

C代码优化方案 1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样? 数组索引指针运算 For(;;){ p=array A=array[t++]; for(;;){ a=*(p++); 。。。。。。。。。。。。。。。 } } 指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须根据t值求数组下标的复杂运算。 2、使用尽量小的数据类型 能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。 在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。 3、减少运算的强度 (1)、查表(游戏程序员必修课) 一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。看下面的例子: 旧代码: long factorial(int i) { if (i == 0) return 1; else return i * factorial(i - 1);

各种字符串处理函数示例(基本)

示例 1.字符串输出示例。 程序: #include void main(void) { char str[25]={"Welcome to our city!"}; puts(str); puts("Thank you!"); } 结果: 2.字符串输入实例。(注意比较gets与scanf和puts与printf的区别)程序: #include void main(main) { char str[20]; gets(str); puts(str); printf("*********\n"); scanf("%s",str); puts(str); } 结果: 3.测字符串长度函数strlen()的使用。 程序: #include #include void main(main) { char a[10]="program";

int x,y; x=strlen(a); y=strlen("abc13"); printf("%d\n%d\n\n",x,y); } 结果: 4.字符串连接函数的使用。 程序: #include #include void main(main) { char s1[20]="Hello",s2[6]="Word"; puts(s1); puts(s2); strcat(s1,s2); printf("%s\n",s1); } 结果: 修改后 程序: #include #include void main(main) { char s1[5]="Hello",s2[6]="Word"; puts(s1); puts(s2); strcat(s1,s2); printf("%s\n",s1); } 结果:

字符串处理函数大全

字符串处理函数大全 bcmp(比较内存内容)相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件;include 定义函数;int bcmp ( const void *s1,const void * s2,int n); 函数说明;bcmp()用来比较s1和s2所指的内存区间前n个字节,若参数n为0,则返回0。返回值;若参数s1 和s2 所指的内存内容都完全相同则返回0 值,否则返回非零值。 附加说明;建议使用memcmp()取代。 范例:参考memcmp()。 //================================================================ bcopy(拷贝内存内容)相关函数 memccpy,memcpy,memmove,strcpy,ctrncpy 表头文件;#include 定义函数;void bcopy ( const void *src,void *dest ,int n); 函数说明;bcopy()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址,不过参数src与dest在传给函数时是相反的位置。 返回值 ;附加说明建议使用memcpy()取代 范例 #include main() { char dest[30]=”string(a)”; char src[30]=”string\0string”; int i; bcopy(src,dest,30);/* src指针放在前*/ printf(bcopy(): “) for(i=0;i<30;i++) printf(“%c”,dest[i]); memcpy(dest src,30); /*dest指针放在钱*/ printf(…\nmemcpy() : “); for(i=0;i<30;i++) printf(“%c”,dest[i]); 执行 bcopy() : string string memcpy() :string sring //================================================================ bzero(将一段内存内容全清为零)相关函数 memset,swab 表头文件;#include 定义函数;void bzero(void *s,int n); 函数说明:bzero()会将参数s所指的内存区域前n个字节,全部设为零值。相当于调用memset((void*)s,0,size_tn); 返回值:附加说明建议使用memset取代

小学英语语法点整理

英语语法点整理 1. 人称代词 主格:I we you she he it they 宾格:me us you her him it them 形容词性物主代词:my our your her his its their 名词性物主代词:mine ours yours hers his its theirs 2. 形容词和副词的比较级 (1) 一般在形容词或副词后+er older taller longer stronger, etc (2) 多音节词前+more more interesting, etc. (3) 双写最后一个字母,再+er bigger fatter, etc. (4) 把y 变i ,再+er heavier, earlier (5) 不规则变化: well-better, much/many-more, etc. 3. 可数词的复数形式 Most nouns + s a book - books Nouns ending in a consonant +y - y+ ies a story Nouns ending in s, sh, ch or x + es a glass —stories —glasses a watch-watches

Nouns ending in o +s or +es a piano —pianos a mango —mangoes Nouns ending in f or fe - f or fe +ves a knife - knives a shelf-shelves 4. 不可数名词(单复数形式不变) bread, rice, water ,juice etc. 5. 缩略形式 I 'm = I am you 're = you are she 's = she is he 's = he is it 's = it is who 's =who is can 't =can not isn 't=is not etc 6. a/an a book, a peach an egg an hour 7. Preposition: on, in ,in front of, between, next to, near, beside, at, behind. 表示时间:at six o 'clock, at Christmas, at breakfast on Monday on 15th July On National Day in the evening in December in winter 8. 基数词和序数词 one —first two-sec ond twen ty-twe ntieth 9. Some /any I have some toys in my bedroom. Do you have any brothers or sisters?

Java程序性能优化方案

Java程序性能优化方案 StringTokenizer比String.split()方法效率高 更优化的方式 Java代码 while(true){ String splitStr=null; int j=temp.indexOf(';'); if(j<0)break; SplitStr=tmp.substring(0,j); tmp=tmp.substring(j+1); } while(true){ String splitStr=null; int j=temp.indexOf(';'); if(j<0)break; SplitStr=tmp.substring(0,j); tmp=tmp.substring(j+1); } 比String.startsWith和endsWith性能更优的方式:Java代码 int len=orgStr.length(); if(orgStr.charAt(0)=='a' &&orgStr.charAt(1)=='b' &&orgStr.charAt(2)=='b'); if(orgStr.charAt(len-1)=='a' &&orgStr.charAt(len-2)=='b' &&orgStr.charAt(len-3)=='c');

int len=orgStr.length(); if(orgStr.charAt(0)=='a' &&orgStr.charAt(1)=='b' &&orgStr.charAt(2)=='b'); if(orgStr.charAt(len-1)=='a' &&orgStr.charAt(len-2)=='b' &&orgStr.charAt(len-3)=='c'); StringBuffer(int capacity)指定初始容量可以减少扩容的操作

VB常用字符串操作函数解读

VB常用字符串操作函数2009/11/25 18:321. ASC(X,Chr(X:转换字符字符码[格式]: P=Asc(X 返回字符串X的第一个字符的字符码 P=Chr(X 返回字符码等于X的字符 [范例]:(1P=Chr(65 ‘ 输出字符A,因为A的ASCII码等于65 (2P=Asc(“A” ‘ 输出65 2. Len(X:计算字符串X的长度 [格式]: P=Len(X [说明]:空字符串长度为0,空格符也算一个字符,一个中文字虽然占用2 Bytes,但也算 一个字符。 [范例]: (1 令X=”” (空字符串 Len(X 输出结果为0 (2 令X=”abcd” Len(X 输出结果为4 (3 令X=”VB教程” Len(X 输出结果为4 3. Mid(X函数:读取字符串X中间的字符 [格式]: P=Mid(X,n 由X的第n个字符读起,读取后面的所有字符。 P=Mid(X,n,m 由X的第n个字符读起,读取后面的m个字符。 [范例]: (1 X=”abcdefg” P=Mid(X,5 结果为:P=”efg” (2 X=”abcdefg” P=Mid(X,2,4 结果为 P=”bcde” 4. R eplace: 将字符串中的某些特定字符串替换为其他字符串 [格式]: P=Replace(X,S,R [说明]:将字符串X中的字符串S替换为字符串R,然后返回。[范例]:X=”VB is very good” P=Replace(X,good,nice 输出结果为:P=”VB is very nice” 5. StrReverse:反转字符串 [格式]: P=StrReverse(X [说明]:返回X参数反转后的字符串 [范例]:(1)X=”abc” P=StrReverse(X 输出结果:P=”cba” 6. Ucase(X,Lcase(X:转换英文字母的大小写 [格式]:P=Lcase(X ‘ 将X字符串中的大写字母转换成小写P=Ucase(X ‘ 将X字符串中的小写字母转换成大写 [说明]:除了英文字母外,其他字符或中文字都不会受到影响。 [范例]:(1)令X=”VB and VC” 则Lcase(X的结果为”vb and vc”,Ucase(X的结果为”VB AND VC” 7. InStr函数:寻找字符串 [格式]: P=InStr(X,Y 从X第一个字符起找出Y出现的位置 P=InStr(n,X,Y 从X第n个字符起找出Y出现的位置 [说明]:(1)若在X中找到Y,则返回值是Y第一个字符出现在X中的位置。(2) InStr(X,Y相当于 InStr(1,X,Y。(3)若字符串长度,或X为空字符串,或在X中找不到Y,则都 返回0。(4)若Y为空字符串,则返回0。 ---------------------------------------------------------------------------------------------- mid(字符串,从第几个开始,长度 ByRef 在[字符串]中[从第几个开始]取出[长度个字符串] 例如 mid("小欣无敌",1,3 则返回 "小欣无" instr(从第几个开始,字符串1,字符串2 ByVal 从规定的位置开始查找,返回字符

字符串处理

字符串处理 1.常见的字符串操作的三种类型 (1)提取和删除字符串 这类处理是取出一个字符串中若干个字符串,基本的方法是:确定需要提取子串的开始位置以及子串的长度。如果题目没有明确给出子串的开始位置及长度的信息,那么可以使用pos函数找出子串前后两个空格的位置,从而确定相关信息。 提取子串:用copy函数将子串提取出来。删除子串:用delete过程直接将子串删除。 (2)字符转换 这类处理是将字符对应的ASCII码按规律进行运算,使该字符转换成另一个字符。我们可以使用ord函数求出某一字符的ASCII码,用chr函数将ASCII码转换成字符。 (3)数值与字符转换 在处理位数很多数值很大的数时,可能超过了整数和实数所能表示的最大范围,在这种情况下,只能采用字符串进行处理。可以使用str过程将数值类型的数据转换成字符串类型,使用val过程可将字符串型数据转换成数值类型。 2.字符串处理的注意事项 (1)读入字串长度如果超过255,则要用字符数组保存字符串。 (2)在分析程序的算法效率时,要注意考虑字符串处理的函数和过程的运行时间。 (3)读数据时,不确定字符行数和每行的字符个数时,可用行结束标记eoln和文件结束 标记eof来读数据。 3.常见的字符串过程和函数 (1)length(s)函数,求字符串s的长度。 (2)copy(s,w,k)函数,在字符串s中从w开始截取长度为k的子串。 (3)val(s,k,code)过程,将字符串s转为数值,存在k中,code返回出错的首位置。 (4)str(i,s)过程,将数值i转为字符串s。 (5)delete(s,w,k)过程,在s中删除从第w位开始的k个字符。 (6)insert(s1, s, w)过程,将s1插到s中第w位。 (7)pos(c, s)函数,求字符c在s中的起始位置。 (8)连接号“+”,将两个字符串连接起来。 (9)upcase(ch)过程,将字母ch转换成大写字母。

六年级英语语法知识点整理

六年级英语语法知识点整理 一、a number of ,the number of a number of 意思是“很多”,相当于a lot of ; the number of意思是“……的数目,……的数量”,当它作主语时,谓语动词用单数形式。 A number of students like playing computer games. 很多学生喜欢玩电脑游戏。 The number of the students is about 1500 in our school. 我们学校学生的人数大约是1500。 二、基数词变序数词助记歌。 基变序,有规律,末尾加上th;一、二、三特殊记,八加h ,九 去e ,ve要用f替;以e结尾变ie,后跟th莫忘记。要想表示几十几,只变个位就能够。 特殊变化:one—first ,two—second ,three—third ,five— fifth , nine—ninth ,twelve—twelfth ,forty—fortieth , eight-nine—eighty-ninth 三、概数(略数)表达法 数词+hundred/thousand/million/billion+名词复数 hundreds/thousands/millions/billions of+名词复数 例1 1. __people go swimming in summer in Dalian.

A、Thousands B、Thousand of C、Thousands of D、Thousand 2. __the students will take part in this English speech contest. A. Two hundred of B. Two hundreds of C. Hundreds of D. Hundred of 一、of sb.与for sb.的区别 (1)of sb.“对于(某人)”,用于It is +adj. +of sb. to do sth.句型中,形容词为clever, kind, nice等描述人物性格特征的词,of后的人物与形容词有主表关系。 (2)for sb.“对于(某人)”,用于It is +adj. +for sb. to do sth.句型中, 形容词为easy, important等不描述人物性格特征的词,for后的人物与形容词没有主表关系。 二、不能同时出现在一个句子中的连词 1、because(因为),so(所以)不能同时出现在一个句子里,只能 用其一。 Because he was tired, he couldn’t walk there. =He was tired ,so he couldn’t walk there. 因为他累了,所以他不能走到那儿了。 2、(al)thouthg(虽然),but (但是)不能同时出现在一个句子里,只能用其一。但thouthg和yet能够同时出现在一个句子里(yet用作 副词) Thought he was tired, he still worked hard. =He was tired, but he still worked hard. 虽然他很累,但他仍然努力工作。

英语语法名词归纳总结

英语语法名词归纳总结 一、单项选择名词 1._________is Virginia Woolf’s most autobiographical novel, which develops a series of thoughts rather than a plot, centering on themes like women’s role in society, death and change. A.The Garden Party B.The Green Room C.To the Lighthouse D.Daisy Miller 【答案】C 【解析】 【详解】 考查名词辨析。句意:《到灯塔去》是弗吉尼亚·伍尔夫最具自传体色彩的小说,它围绕女性在社会中的角色、死亡和变化等主题展开了一系列的思考而非情节的描写。A. The Garden Party《花园聚会》;B. The Green Room《候场室》;C. To the Lighthouse 《到灯塔去》;D. Daisy Miller《黛西·米勒》。由“Virginia Woolf”可知,Virginia Woolf是To the Lighthouse《到灯塔去》的作者。故选C项。 2.Violent programs on television may have a bad on children. A.injury B.pressure C.impression D.influence 【答案】D 【解析】 【详解】 考查名词。A. injury伤害; B. pressure压力; C. impression印象; D. influence影响。句意:电视上的暴力节目可能对孩子有不良影响。固定词组:have an effect/ influence on“对------有影响”。故选D。 3.How amazing it is that Zuckberg can speak Chinese! After all, it is a big_____ for any westerner to learn such a totally different language. A.adventure B.achievement C.trend D.challenge 【答案】D 【解析】 【详解】 考查名词词义辨析。A. adventure冒险;B. achievement成就;C. trend趋势;D. challenge 挑战。句意:扎克伯格会说中文是多么令人吃惊啊!毕竟,对任何西方人来说,学习一门完全不同的语言是一个巨大的挑战。根据句意可知此处表示“挑战”,故D项正确。 4.One hundred percent_______to your studies, though it can be lonely and no fun at all,will leave precious marks on your youth. A.response B.offence C.commitment D.reaction

字符串处理常用方法

C# string类应用 判断是否包含子串 想要判断一个字符串中是否包含某个子串,可以用Contains方法来实现: public bool Contains (string value) 参数value为待判定的子串。如果包含,返回true;否则返回false。下面的代码判断“Hello”中是否包含两个子串。 1.bool b1 = strA.Contains("ll"); //true 2.Bool b1=strA.Contains("MM"); //false 4.1.4 定位字符和子串 定位子串是指在一个字符串中寻找其中包含的子串或者某个字符。在String类中,常用的定位子串和字符的方法包括IndexOf/LastIndexOf及IndexOfAny/LastIndexOfAny,下面进行详细介绍。 1.IndexOf/LastIndexOf IndexOf方法用于搜索在一个字符串中,某个特定的字符或者子串第一次出现的位置,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符或子串,则返回-1。常用的重载形式如下所示。 (1)定位字符 int IndexOf(char value) int IndexOf(char value, int startIndex)

int IndexOf(char value, int startIndex, int count) (2)定位子串: int IndexOf(string value) int IndexOf(string value, int startIndex) int IndexOf(string value, int startIndex, int count) 在上述重载形式中,其参数含义如下: value:待定位的字符或者子串。 startIndex:在总串中开始搜索的其实位置。 count:在总串中从起始位置开始搜索的字符数。 下面的代码在“Hello”中寻找字符…l?第一次出现的位置。 代码4-7 使用IndexOf寻找字符第一次出现位置:Default.aspx.cs 1. String s=”Hello”; 2. int I = s.IndexOf(…l?)); //2 同IndexOf类似,LastIndexOf用于搜索在一个字符串中,某个特定的字符或者子串最后一次出现的位置,其方法定义和返回值都与IndexOf相同,不再赘述。 2.IndexOfAny/LastIndexOfAny IndexOfAny方法功能同IndexOf类似,区别在于,它可以搜索在一个字符串中,出现在一个字符数组中的任意字符第一次出现的位置。同样,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符或子串,则返回-1。常用的IndexOfAny 重载形式有3种:

相关主题
文本预览
相关文档 最新文档