COBOL混淆

3
大家好,我在使用COBOL处理zOS环境下的编码项目时遇到了一些问题。我需要读入一个文件并将其放入一个索引表中(我知道记录数不超过90条)。
问题出在我们必须使用一个叫做“Table-Size”的变量(在声明时设为零)的限制条件上。
考虑到这些,我需要做类似于“Occurs 1 to 90 times Depending on Table-Size”的操作,但如果像我所说的那样table-size被递增,那么这个操作会如何运作呢?请问有人能够帮我解决这个问题吗?
谢谢!
2个回答

9

你的主要关注点是什么:如果数组大小在运行时更改,编译器如何知道分配多少空间?

答案是,它分配了最大的空间(足够存储90个条目)。请注意,这是用于“工作存储器”的空间。当记录被写入“文件”时,只有相关部分才会被写入。

例如:

01  TABLE-SIZE  PIC 9
01  TABLE OCCURS 1 TO 9 TIMES DEPENDING ON TABLE-SIZE
    03 FLD1  PIC X(4)

这将为工作存储中的TABLE分配36个字符(9乘以4)。如果在将记录写入文件时将TABLE-SIZE设置为2,则只会写入8个TABLE字符(当然还包括为TABLE-SIZE写入的字符)。

例如,如果由TABLE占用的内存为AaaaBbbbCcccDdddEeeeFfffGgggHhhhIiii,则写入文件的日期可能是缩短的(包括大小):2AaaaBbbb

同样,在读回记录时,TABLE-SIZE和相关位的TABLE都将从文件中填充(仅设置大小和前两个元素)。

我不认为未使用的TABLE条目在发生这种情况时会被初始化为任何内容。无论如何最好假设没有,如果需要向表中添加另一个项目,则显式地填充它们。

为了提高效率,您可能希望将TABLE-SIZE设置为USAGE IS COMP

变长数据的处理已经很繁琐了。对于ODO变量使用USAGE DISPLAY字段没有任何意义,反而会增加复杂度。将其定义为“二进制”。 - Bill Woodger
@Bill,我认为你说得很好,虽然与问题有些关联。我会加上一条注释,因为这绝对是一个好建议。 - paxdiablo
问题是“如何使用OCCURS DEPENDING ON”。编译器以二进制处理ODO,因此ODO字段的二进制定义似乎是一个非切题的建议。USAGE DISPLAY或COMP-3/PACKED-DECIMAL将起作用,但如果引用了更高级别的组项(例如将其写入文件),则始终会涉及额外生成的代码。我不知道您所说的“转换为二进制”在超过九个时变得更加复杂的含义。 - Bill Woodger
嗯...你一定在使用不同的编译器。你用的是哪一个?我不认识,因为我一直使用的是PACK/CVB编译器。 - Bill Woodger
我随着经验的增加变得更加整洁了。现在我们要删除所有这些注释吗? - Bill Woodger
显示剩余3条评论

2

我们这里缺少足够的信息,但基本的事情是,在 DEPENDING ON 子句中命名的变量必须具有变量组数的计数。因此,您需要像这样:

01   TABLE-SIZE     PIC 99
01   TABLE OCCURS 1 TO 90 TIMES
       DEPENDING ON TABLE-SIZE
    03 FIELD-1
    03 FIELD-2

等等其他内容。

请参阅此文章或Publib中的此文章


非常感谢你提供的参考资料,Charlie。我会仔细阅读,并且相信它将在未来对我有所帮助。谢谢! - Enyalius
与上述相同。将表大小“二进制”化。 - Bill Woodger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接