为什么 OPTIONS(*TRIM) 不像 IBM 所说的那样工作,这里缺少什么?

问题描述 投票:0回答:2
**free
ctl-opt main(main);

dcl-pr main ExtPgm('TSTPGM');
  *n char(10) const options(*trim);
  *n char(10) const options(*trim);
end-pr;

dcl-pr ExecCmd Extpgm('QCMDEXC');
  Command Char(40);
  CmdLen  Packed(15:5);
end-pr;

dcl-s str0        Char(100) inz;
dcl-s $RRN        Packed(6);
dcl-s Command     Char(40);
dcl-s CmdLen      Packed(15:5) Inz(%Len(Command));

dcl-proc main;
  dcl-pi *n ;
    file char(10) const options(*trim);
    lib  char(10) const options(*trim);
  end-pi ;

  Command = 'DSPFFD FILE('+lib+'/'+file+') OUTPUT(*OUTFILE) OUTFILE(QTEMP/QADSPFFD)';

  Monitor;
    ExecCmd (Command: CmdLen);
  On-Error;
  EndMon;

end-proc main;

here is how the Command looks like

我期待 Options(*Trim) 修剪输入参数、文件和库,这样我就不必在构建命令字符串之前使用 %trim :|

此选项使用起来是否非常不可靠,或者可以使用的设置是否有限?

OS 详细信息:我在 TR1 上运行 7.5

ibm-midrange rpgle rpg
2个回答
0
投票

文档

如果参数不是变长参数,修剪后的值 用空格填充(如果指定了 OPTIONS(*RIGHTADJ),则在左侧, 否则在右边)。


0
投票

正如@nfgl 指出的

options(*TRIM)
只能修剪一个
varchar
字段。

固定长度

char
字段始终是它们定义的任何长度,因此如果未填充,则始终存在填充。

此外,鉴于这是 *PGM 源,我要指出,如果您打算从命令行调用 *PGM,只需将参数更改为

varchar
将无法解决问题。
options()
关键字功能实际上是由原型过程的调用者实现的;不是被叫者。

鉴于 IBM i 命令行处理器无法访问 RPG 原型,它不会知道

options(*TRIM)
已指定。

换句话说,

options()
仅在给定 RPG 调用者时才有用,因为 RPG 编译器会生成支持调用者功能所需的代码。

一个完美的例子,你有一个 RPG 过程调用一个 ILE C 过程,它需要一个 C 标准空终止字符串。当您为 C 程序定义 RPG 原型时,您将使用

const options(*TRIM:*STRING)

现在我已经输入了最后一句话,我意识到这是第一句的例外。 :) 当调用 C 程序时,

const options(*TRIM:*STRING)
将用于
char
字段而不是
varchar
字段。 RPG
varchar
不能很好地与 C 程序一起玩,因为他们不期望前导 2 或 4 字节长度。

© www.soinside.com 2019 - 2024. All rights reserved.