使用RPG中的MOVEL函数对文本进行子串

时间:2012-08-07 12:11:43

标签: rpgle

问题:

是否使用MOVEL函数从RPG中的文本中获取子串n个字符,该函数采用长度为x的文本并将其存储到容量为n的变量中?

或者获取前n个字符的唯一保存方法是使用SUBST?

问题的背景是我的同事从数据库中获取前3个字符,其中30个字符长度是使用MOVEL到一个长度只有3个字符的变量(比如截断其余部分)。奇怪的方式,有时接收变量显示减去字符(' - '),有时不显示。所以我假设使用MOVEL不是一种安全的方法。我想C中的字符串总是以'\ 0'结尾,你需要使用strcpy函数来获取复制保存,而不是使用=运算符分配。

谁知道RPG熟悉这个问题?

2 个答案:

答案 0 :(得分:3)

MOVEL应该有用。 RPG允许多个character data types。一般来说,使用MOVEL的人不会处理空终止字符串,因为MOVEL是一种旧技术,而空终止字符串是更新的数据类型。您可以阅读RPG手册中的MOVEx operationsstring operations。要获得更好的答案,请发布您的代码,包括所涉及变量的定义。

编辑:MOVEL如何处理标志的示例。

   dcl-s long char(20) inz('CORPORATION');
   dcl-s short char(3) inz('COR');
   dcl-s numb packed(3: 0);

   // 369
 c                   movel     long          numb
   dsply numb;

   // -369
 c                   movel     short         numb
   dsply numb;


   *inlr = *on;

答案 1 :(得分:1)

对于RPG中的带符号数字字段,符号保存在字段的最后一个字节的区域中。所以123是X' F1F2F3'但-123是X' F1F2D3'。如果您将这些字段视为字符串,则它们将包含123和12L。

在您的计划中,您正在转移类似于" 123 AAAAAL"到3位数字字段,这样你就得到了X' F1F2F3'但因为最后一个角色是X' D3'将结果更改为具有D区域,即X' F1F2D3' 您的异常取决于第30个字符包含的内容。如果它是}或任何大写字母J到R那么你会得到一个负面结果。 [前三个字符是数字还是字母并不重要,因为它只是字节的后半部分,数字,在你的例子中很重要。]

IBM手册说: 如果因子2是字符且结果字段是数字,则如果从因子2的最右侧位置开始的区域是十六进制D(减去区域),则减号区域将移动到结果字段的最右侧位置。但是,如果从因子2的最右侧位置开始的区域不是十六进制D,则将正区域移动到结果字段的最右侧位置。其他结果字段位置仅包含数字字符。