首先,我要感谢你花时间看看我的问题。 我正在学习COBOL,我一直在练习,我必须创建一个来自一个国家的多个城市的变量,我知道如何使用层次结构来创建它:
01 COUNTRY.
02 CITY-A PIC A(5) VALUE "TOKYO".
02
02
等等
这里的问题是我不知何故需要这些值能够被他们的位置引用。例如,我应该能够通过数字引用CITY-A“TOKYO”。有没有办法做到这一点?我似乎无法弄清楚这一点。 任何帮助将不胜感激。 再次感谢!
答案 0 :(得分:4)
您需要定义您的城市表。继续你已经展示的风格,这是一个VALUE子句的例子。
01 CITY-TABLE.
05 FILLER PIC X(30) VALUE "TOKYO".
05 FILLER PIC X(30) VALUE "KYOTO".
05 FILLER PIC X(30) VALUE "AIZUWAKMATSU".
... another 47 of these
请注意,所有项目的长度必须相同。 " TOKYO"是五个字符加上25个尾随空格。 " AIZUWAKMATSU"是更多的字符,更少的尾随空格,但仍然是30个字节。如果您使用不同长度的字段定义城市,则无法通过数字"来引用它们。
然后,您将需要使用REDEFINES来提供不同的数据映射,在这种情况下,为其提供一个名称,该名称可用于表中的不同事件。
01 FILLER REDEFINES CITY-TABLE.
05 CITY-NAME PIC X(30) OCCURS 50 TIMES.
定义了数据结构后,您可以尝试使用它。
MOVE "TOKYO" TO CITY-NAME
实际上,你不能这样做。编译器不会让你。有50个CITY-NAME元素,编译器要求您在使用CITY-NAME时告诉它要使用哪个元素。
要访问表格中的元素,您需要使用下标。
下标遵循其数据名称("合格"必要时),并括在括号/括号中。
MOVE "TOKYO" TO CITY-NAME ( 1 )
现在将编译。它使用数字整数文字作为下标。在每种情况下都没用,因为我们经常会循环播放"使用表格。
MOVE "TOKYO" TO CITY-NAME ( some-name )
这里some-name
可以是程序员定义的数据(作为数字整数),也可以是"索引",编译器将管理的数字整数。
要建立"索引",您需要在包含OCCURS子句的项目上使用某个名称编写INDEXED BY。
如果您使用数据名称作为下标,它只是一个数据名称,您可以使用它可以使用的COBOL动词无限制。
如果使用索引名称(INDEXED BY),则只能使用SET,PERFORM和SEARCH更改索引名称的值。
PERFORM VARYING some-name FROM 1 BY 1
UNTIL input-byte ( some-name ) EQUAL TO SPACE
OR some-name GREATER THAN 10
...
END-PERFORM
这不是一个好循环,但它会让你开始。
完成后,some-name将为11(未找到空格)或将设置为与数据中第一个空格匹配的表的值。
在上面的PERFORM中,某个名称可以是索引名称或数据名称。结果将是相同的,编译器生成的将是不同的。
但是,作为初学者,您不应该关注使用数据名作为下标和使用索引名作为下标之间的区别。您的结果将是相同的,生成的代码将是不同的。保持不变,直到你有更多的经验。
您可以拥有多维表格。你可以"抵消"正数或负数的下标。在性能方面,下标有一个用户的层次结构。在准确地使用&#34之前,有很多理解;一个比另一个更快" (您可以轻松地编写最快的访问代码,然后通过以愚蠢的方式执行循环来节省更多的空间)。还有一个索引数据项。
所有这些都可以用于以后。先走好。
最后的混淆(有很多关于下标的混淆)是有参考修改。这看起来有点像使用下标,但不是,但可以用作访问文本表的曲折(从后来的理解的角度来看)。
MOVE "TOKYO" CITY-TABLE ( 1 : 30 )
请注意,正在使用表名而不是条目名。冒号(:)告诉它是引用修改。在结肠是起始位置之前,结肠是长度。起始位置和长度都可以是数据名称(但不是索引名称)。
然而,
MOVE CITY-TABLE ( VAR1 : 10 )
参考修改的典型草率使用让读者想知道该数据正在做什么。
可以对引用的项目进行引用修改,但同样适用于以后的目的。