Ibm midrange 在(自由)RPGLE中使用BIFs将数组移动到charsequence

Ibm midrange 在(自由)RPGLE中使用BIFs将数组移动到charsequence,ibm-midrange,rpgle,Ibm Midrange,Rpgle,有人能告诉我如何将字符数组转换成字符吗 我已经定义了 D charseq 100a value 及 现在,我反转了charseq,并使用BIF%subst(string:index:length)将每个字符存储在chresq的相应字段中: C 1 do 101 x C eval chrseq(101-x) = %subst(char

有人能告诉我如何将字符数组转换成字符吗

我已经定义了

 D  charseq                     100a   value

现在,我反转了
charseq
,并使用BIF
%subst(string:index:length)
将每个字符存储在
chresq
的相应字段中:

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

代码如下:

 P*            -------------------------------------------------------------
 P*            getLastChar - Get last non-blank char in parameter
 P*            -------------------------------------------------------------
 P getLastChar     b                   export
 D getLastChar     pi             1a
 D*  Input-parameter
 D  charseq                     100a   value
 D*  Local fields
 D  lastChar       s              1a   inz(' ')
 D  chrseq         s              1a   dim(100)
 C
 C*            -------------------------------------------------------------
 C*            Error handling
 C*            -------------------------------------------------------------
 C     charseq       ifeq      *blanks
 C                   return    x'00'
 C                   endif
 C
 C*            -------------------------------------------------------------
 C*            Reverse input char sequence
 C*            -------------------------------------------------------------
 C     1             do        101           x
 C                   eval      chrseq(101-x) = %subst(charseq:x:1)
 C                   enddo
 C*  Now: How do I get chrseq(1) to chrseq(100) into charseq back?
 C*            -------------------------------------------------------------
 C*            Get last non-blank char
 C*            -------------------------------------------------------------
 C                   eval      charseq = %triml(charseq)
 C                   eval      lastChar = %subst(charseq:1:1)
 C
 C
 C                   return    lastChar
 C
 P getLastChar     e    

提前谢谢

这个把戏似乎对我有用

charseq = %Str(%Addr(chrseq));
但是,还有一些其他的选择。首先,可以在charseq上使用指针和based关键字

Dcl-S charptr Pointer Inz(%Addr(charseq));
Dcl-S charseq Char(100);
Dcl-S chrseq  Char(1) Dim(100) Based(charptr);
或者您可以删除指针和based关键字以使用数据结构和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);

因此,与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;

感谢Liam的快速回答,但是指针的解决方案不适合我,因为charseq和chrseq是两个独立的东西。charseq是我从调用过程中得到的一个参数,chrseq只是一个局部字段。如果我使用第二种解决方案,参数会被覆盖,因此当将charseq的内容反转为chrseq时,charseq也会被修改,而不是最后一个字符。只是给定字符串的最后一个“非空”字符
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;