You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何OPTIONS(*TRIM)未按IBM说明生效?缺失了什么?

RPGLE中OPTIONS(*TRIM)选项未生效的原因及限制

在IBM i 7.5 TR1环境下编写RPGLE程序时,若期望通过OPTIONS(*TRIM)自动修剪输入参数file和lib的前后空格,却发现该选项未生效,核心原因是使用位置错误,而非选项本身存在可靠性问题。

问题代码

**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;

关键说明与修正

OPTIONS(*TRIM)的生效有明确场景限制:

  • 该选项仅对外部程序调用的原型参数(即带有ExtPgm标识的dcl-pr定义的参数)生效,外部调用程序传入的参数会被自动修剪前后空格。
  • 内部过程main的dcl-pi中添加的OPTIONS(*TRIM)完全无效,因为dcl-pi是内部过程的接口,参数是从外部原型传递过来的,并非直接接收外部输入。

修正后的代码只需保留外部原型的OPTIONS(*TRIM),内部过程接口无需添加该选项:

**free
ctl-opt main(main);

// 外部调用入口原型:此处的OPTIONS(*TRIM)才会生效
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;
    lib  char(10) const;
  end-pi ;

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

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

end-proc main;

额外注意:OPTIONS(*TRIM)仅修剪参数的前后空格,参数中间的空格不会被处理,若需要处理中间空格仍需手动使用字符串函数。

内容的提问来源于stack exchange,提问作者ojay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:28:37