在(免费)RPGLE 中使用 BIF 将数组移动到字符序列
Moving array to charsequence using BIFs in (free)RPGLE
谁能告诉我如何将 char 数组转换为字符?
我已经定义了
D charseq 100a value
和
D chrseq s 1a dim(100)
现在我反转charseq
并使用BIF%subst(string:index:length)
将每个字符存储在chrseq
的相应字段中:
C 1 do 101 x
C eval chrseq(101-x) = %subst(charseq:x:1)
C enddo
但现在我的问题来了:如何将 chrseq
转换为我的 charseq
?
在好旧 RPG/400 我通过 MOVEA
完成了这个但是有任何(现代)RPGLE 版本吗??
代码如下:
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);
或者您可以删除 pointer 和 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;
但是如果你只想return字符串的最后一个字符,我会这样做。
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;
谁能告诉我如何将 char 数组转换为字符?
我已经定义了
D charseq 100a value
和
D chrseq s 1a dim(100)
现在我反转charseq
并使用BIF%subst(string:index:length)
将每个字符存储在chrseq
的相应字段中:
C 1 do 101 x
C eval chrseq(101-x) = %subst(charseq:x:1)
C enddo
但现在我的问题来了:如何将 chrseq
转换为我的 charseq
?
在好旧 RPG/400 我通过 MOVEA
完成了这个但是有任何(现代)RPGLE 版本吗??
代码如下:
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);
或者您可以删除 pointer 和 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;
但是如果你只想return字符串的最后一个字符,我会这样做。
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;