为何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
相关产品推荐
相关产品推荐

