我正在寻找从rpgle
中的子过程返回多个值(如数组)的方法。我不想使用文件等来存储此值。
有人可以推荐任何好的方法来实现这个目标吗?
答案 0 :(得分:4)
最多只传回20个值......
你可以直接传回数组..
dcl-proc TestProc;
dcl-pi *n char(20) dim(20) ;
parm1 char(20);
end-pi;
dcl-s myarray char(20) dim(20);
return myarray;
end-proc;
或者,您可以将proc定义为例如返回DIM(200)
,并传入一个值,表示您实际需要多少个值。当您进行呼叫时,编译器会很乐意将DIM(200)
截断为DIM(20)
。这将提供更多的灵活性。如果你打算每秒打这1000次,那么缺点就是性能。返回"大"价值观会有一些性能损失。
假设最新版本的操作系统,IBM添加了RTNPARM关键字以提高大型返回值的性能。
dcl-proc MainProc;
dcl-s arr char(20) dim(20);
arr = TestProc(%elem(arr));
dsply arr(1);
end-proc;
dcl-proc TestProc;
dcl-pi *n char(20) dim(200) rtnparm ;
howmany int(10) value;
end-pi;
dcl-s myarray char(20) dim(200);
dcl-s x int(10);
for x = 1 TO howmany;
// load array
myarray(x) = 'Something';
endfor;
return myarray;
end-proc;
David提到的数据队列和数据区域是其他可能性。
他们可能会通过其他语言提供更多辅助功能。但它们有点难以使用。幸运的是,您总是可以提供一个包装器,将返回的数组转换为其他内容。
答案 1 :(得分:4)
如果被调用的过程决定要返回多少个元素,那么如果使用返回值机制,最好将返回值定义为具有数组和值数的数据结构。
复制文件
dcl-c MAX_VALUES_RETURNED 20;
dcl-ds values_t qualified template;
num int(10);
arr char(200) dim(MAX_VALUES_RETURNED);
end-ds;
dcl-pr proc likeds(values_t) rtnparm;
...
<强>呼叫者强>
dcl-ds values likeds(values_t);
values = proc(parms);
for i = 1 to values.num;
... handle values.arr(i)
答案 2 :(得分:0)
考虑使用数据队列发回值列表。
该过程会将结果发送到数据队列并返回数据队列名称(或键控数据队列的密钥)。
然后,调用程序将读取数据队列(如果队列已存在,则可能通过密钥读取)并处理条目。
数据队列快速,简单,并且您具有能够与其他语言一起使用的额外优势......即使它们不在IBM i(例如java)上。