通过在函数定义中指定参数的数据类型以及要传递的参数是仅用于输入的参数 (IN)、 仅用于输出的参数 (OUT) 还是输入/输出参数 (INOUT) 来将参数传递给程序。例如:
%function(DTW_DIRECTCALL) dc2(IN CHAR(3) p1,
INOUT INTEGER p2,
OUT DECIMAL(7,2) p3) {
%EXEC { /QSYS.LIB/NETDATA.LIB/MYPGM.PGM %}
%}
在上面的例子中,“直接调用”语言环境向程序 MYPGM 传递了三个参数:一个字符变量、 一个整数和一个压缩十进制变量。最多可以向被调用的程序传递 50 个参数。 只有用数据类型指定的参数才会被传递到程序。“直接调用”语言环境将对应于该参数的字符串转换为 数据类型的内部表示。然后,语言环境以函数定义中指定的顺序将指向变量内部表示的指针传递给被调用的程序。
因为指向变量的指针被传递给了程序,因此程序就可以更改该变量的值。当然,只有那些被程序 更改过的 OUT 或 INOUT 变量才会反馈到调用语言环境的宏中。
表 4列出了“直接调用”语言环境所支持的数据类型。并非所有的
数据类型都受到每一种高级语言的支持。
| 数据类型 | 用法注意 |
|---|---|
CHAR(n) CHARACTER(n) CHARACTER | 一个字符串。如果指定 n,则必须大于零。如果没有指定字符串, 则将假定它是一个字符。因为从“直接调用”语言环境传递过来的所有字符串都是以 NULL 结束的, 所以语言环境将分配 n+1 个字节(其中 1 个字节用于 NULL 结束符)。超过 n 的字符串都将被截断。 |
| VARCHAR(n) | 一个可变长度的字符串,其中 n 大于等于 0 且小于等于 32740。 这个字符串是以 NULL 结束的,语言环境共分配 n+2+1 个字节 (2 个字节用于存储字符串长度, 1 个字节用于 NULL 结束符)。超过 n 的字符串都将被截断。字符串的前两个字节包含了字符串的 长度(二进制值)。如果该参数定义为 OUT (仅用于输出),则在将变量传递给被调用程序之前将把字符串长度设置为零。 |
INTEGER INT | 一个带符号的二进制整数,长度为 4 个字节。 |
| SMALLINT | 一个带符号的二进制整数,长度为 2 个字节 |
| FLOAT(p,s) | 单精度或双精度,浮点数。在单精度情况下,p 必须大于 0 且 小于 25。在双精度情况下,p 必须大于 24 且小于 54。精度 (p) 和 缩放程度 (s) 都只在将数据转换为可显示格式时使用;例如,在转换为字符串时使用。 |
| REAL(p,s) | 一个单精度浮点数。p 必须大于 0 且小于 25。精度 (p) 和 缩放程度 (s) 都只在将数据转换为可显示格式时使用;例如,在转换为字符串时使用。 |
DOUBLE (p,s) DOUBLEPRECISION(p,s) | 一个双精度浮点数。p 必须大于 0 且小于 53。精度 (p) 和 缩放程度 (s) 都只在将数据转换为可显示格式时使用;例如,在转换为字符串时使用。 |
| NUMERIC(p,s) | 一个分区十进制数,精度为 p,缩放程度为 s。 p 的值必须大于 0 且小于 32。 |
DEC(p,s) DECIMAL(p,s) | 一个压缩十进制数,精度为 p,缩放程度为 s。 p 的值必须大于 0 且小于 32。 |
| DTWTABLE | 一个特殊的数据类型,用于将 Net.Data 表格传递给 被调用的程序。“直接调用”语言环境传递一个指向表格的指针,可以使用 Net.Data 语言环境接口 表格函数对其进行处理。 |
被定义为数字的参数可以包括货币符号和三个数字的分隔符。“直接调用”语言环境在将数值变量传递给程序之前, 先把它从字符串格式转换成其内部格式,并在此时除去货币符号和三个数字的分隔符。Net.Data 从 运行 Net.Data 的进程的进程属性中检索货币符号、十进制格式和三位数字分隔符字符。
如果配置文件或宏中的 DTW_PAD_PGM_PARMS 设置为 NO,则“直接调用”语言环境将使用 一个 NULL 结束符(值 x'00') 把字符串值传递到您的程序。这需要您编写代码来处理字符串(除非 使用 C 或 C++,它们使用的是以 NULL 结束的字符串)。
例如,如果定义的参数字段是 CHAR(10),但传递的字符串值长度为 5 个字节,那么 Net.Data 将在 第 5 个字节后加一个 NULL 结束符。将值“12345”作为一个字符串传递到 CHAR(10) 字段, 结果是:
x'F1F2F3F4F500........'
NULL 结束符之后的字节是未定义的(不能假定那些字节 为 NULL 或为空)。
因为该字符串是以 NULL 结束的,并且在 NULL 结束符之后包含未初始化的字节, 因此不能在 RPG 或 COBOL 程序中使用这个字符串。 例如,如果将字符串用在比较操作中,该操作将不会产生有效的结果。程序不期望字符串包含 NULL 结束符, 而期望用空格填充字符串的结尾。
可以在程序中使用字符串处理函数来抽取字符串值,也可以使用 VARCHAR 数据类型。这种方法在最前面 的两个字节中给出字符串的长度。
如果配置文件或宏中的 DTW_PAD_PGM_PARMS 设置为 YES,“直接调用”语言环境将把用空格向右填充至精度 长度的字符串值传递给程序。使用与上述相同的例子,但 DTW_PAD_PGM_PARMS 设置为 YES, 那么将值“12345”作为一个字符串传递到 CHAR(10) 字段的结果是:
x'F1F2F3F4F5404040404000'
因为字符串的长度为 5,小于指定的精度,因此在该值之后插入了一些空格, 直至达到精度所需的长度。现在,用 RPG 等语言编写的程序就可以使用该参数了,不必再处理以 NULL 结束的字符串。
以下列表描述了使用“直接调用”语言环境调用程序或向程序传递参数时可能发生的错误。 同时提供了避免这些错误的技巧。