在(免费)RPGLE中使用BIF将数组移动到charsequence

时间:2017-12-04 11:01:16

标签: ibm-midrange rpgle

有人可以告诉我如何将char数组转换为字符吗?

我定义了

blobs/default/content

 D  charseq                     100a   value

现在我撤消 D chrseq s 1a dim(100) 并使用BIF charseq%subst(string:index:length)的相应字段中存储每个字符:

chrseq

但现在这是我的问题:如何将 C 1 do 101 x C eval chrseq(101-x) = %subst(charseq:x:1) C enddo 转换为chrseq? 在好旧的RPG / 400中我通过charseq完成了这个,但是有没有(现代)RPGLE版本?

以下是代码:

MOVEA

提前致谢!

2 个答案:

答案 0 :(得分:2)

所以类似于Liam建议的是使用数据结构并将数据结构分配给第二个参数。

dcl-proc ReverseCharacters;
  dcl-pi *n Char(100);
    charseq         Char(100) Const;
  end-pi;

  dcl-ds chards;
    chrseq         Char(1) Dim(100);
  end-ds;

  dcl-s charseq    Char(100);
  dcl-s x          Int(5);

  for x = 100 downto 1;
    chrseq(x) = %substr(charseq:x:1);
  end-for;

  return %triml(chrds);
end-proc;

但是如果你想要做的就是返回一个字符串的最后一个字符,我会这样做。

dcl-proc LastChar;
  dcl-pi *n Char(1);
    str     Varchar(100) Const;
  end-pi;

  if %len(str) = 0;
    return '';
  endif;
  return %substr(str: %len(%trimr(str)): 1);
end-proc;

答案 1 :(得分:1)

这个技巧似乎对我有用

charseq = %Str(%Addr(chrseq));

但是还有其他几种选择。首先,您可以使用指针和基于charseq的基础关键字

Dcl-S charptr Pointer Inz(%Addr(charseq));
Dcl-S charseq Char(100);
Dcl-S chrseq  Char(1) Dim(100) Based(charptr);

或者您可以删除指针和基础关键字以使用数据结构和pos关键字

Dcl-Ds memoryDS;
  charseq Char(100);
  chrseq Char(1) Dim(100) Pos(1);
End-ds;

然后,无论何时分配给chrseq索引,它都将超过charseq内存

//Any changes to chrseq will happen in charseq memory
chrseq(1) = 'H';
chrseq(2) = 'e';
chrseq(3) = 'l';
chrseq(4) = 'l';
chrseq(5) = 'o';

Dsply %Subst(charseq:1:52);