2014-05-10 34 views
0

首先,讓我感謝您花時間看看我的問題。 我學習COBOL和我一直給人一種運動,我必須創建具有許多從全國多個城市的一個變量,我知道如何與像層次的東西創造這樣的:創建變量,我可以通過它們的位置引用它的值COBOL

01 COUNTRY. 
02 CITY-A PIC A(5) VALUE "TOKYO". 
02 
02 

等等等

這裏的問題是,我不知何故需要這些值能夠被他們的位置引用。例如,我應該可以通過一個數字來引用CITY-A「TOKYO」。有沒有辦法做到這一點?我似乎無法弄清楚這一點。 任何幫助將不勝感激。 再次感謝!

+1

善良,這帶我回來,我建議你看看'發生'條款,這是用來聲明'數組'。這可能是有用的:[2010/01/table-handling.html](http://www.mainframes360.com/2010/01/table-handling.html) –

+0

嘿瑞恩,這似乎正是我正在尋找因爲,我會試一試,非常感謝你! – user3624270

+2

我在鏈接中閱讀的文章越多,我越喜歡它。一般來說,你會從那裏得到重點,但有很多錯誤和混淆。 –

回答

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 

請注意,所有項目必須是相同的長度。 「東京」是五個字符加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 some-name。

如果您使用數據名稱作爲下標,它只是一個數據名稱,並且您可以使用的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中,some-name可以是索引名稱或數據名稱。結果將是相同的,編譯器產生的結果將會不同。

但是,作爲初學者,您不應該關心將數據名稱用作下標並將索引名稱用作下標。你的結果將是相同的,生成的代碼將會不同。留在那,直到你有更多的經驗。

您可以擁有多維表格。您可以通過正數或負數「抵消」下標。在表演的情況下,下標有一個層次。在你準確地使用「一個比另一個更快」之前,你有很多的理解(你可以輕易地編寫最快的訪問,然後通過以愚蠢的方式執行循環來節省大量的開銷)。還有一個索引數據項。

所有這些東西都可以在以後使用。先走好。

最後的困惑(有很多與下標混淆)是否有引用修改。這看起來有點像使用下標,但不是,但可以用作訪問文本表格的曲折(從稍後理解的角度)。

MOVE "TOKYO" CITY-TABLE (1 : 30) 

請注意,正在使用表名而不是輸入名稱。冒號(:)表示它是引用修改。在冒號是開始位置之前,冒號是長度之後。起始位置和長度都可以是數據名稱(但不是索引名稱)。

然而,

MOVE CITY-TABLE (VAR1 : 10) 

的參考修改一個典型的草率使用,會使讀者想知道正在使用該數據來完成。

下標項目可以參考修改,但也是爲了以後。

+0

非常好,完整的答案。其實比評論中給出的文章鏈接好得多。 – NealB

+0

@NealB謝謝。如果鏈接是好的,則不需要答案。當我記得的時候,我必須和作者談一談。他非常熱衷,但並不總是透徹。感謝編輯。 –

相關問題