0

问题:

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

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

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

任何了解 RPG 的人都熟悉这个问题?

4

2 回答 2

3

移动应该工作。RPG 允许多种字符数据类型。一般来说,使用 MOVEL 的人不会处理以空结尾的字符串,因为 MOVEL 是一种旧技术,而以空结尾的字符串是一种较新的数据类型。您可以阅读 RPG 手册中的MOVEx 操作字符串操作。为了获得更好的答案,请发布您的代码,包括所涉及变量的定义。

编辑: 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;
于 2012-08-07T13:33:16.167 回答
1

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

在您的程序中,您将“123 AAAAAL”之类的内容传输到 3 位数字字段,因此您得到 X'F1F2F3',但因为最后一个字符是 X'D3',它会将结果更改为具有 D 的区域,即 X'F1F2D3'您的异常取决于第 30 个字符包含的内容。如果它是 } 或任何大写字母 J 到 R,那么你会得到否定的结果。[前 3 个字符是数字还是字母并不重要,因为在您的示例中,只有字节的后半部分(即数字)才重要。]

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

大学教师

于 2015-02-06T02:00:13.420 回答