2011-01-27 99 views
4

我編碼程序,如:有沒有辦法在COBOL中參數化函數?

READ-A. 
     READ FILE-A 
      AT END 
      MOVE 1 TO EOF-A 
      NOT AT END 
      ADD 1 TO CN-READ-A 
     END-READ. 
F-READ-A. EXIT. 

讀取多個文件,我想知道如果有一種方法來編寫一個程序,它能夠從變量讀取的文件名,所以我不必碼每個文件都是一樣的。謝謝!

回答

2

的一個解決方案如上面所述是使用多個程序或嵌套程序,爲此 我已經包括下面的例子,這是溶液1.

另一個解決方案是COBOL類,這可能不是給你的喜歡但我喜歡它們,所以我包含了一個例子,這就是解決方案2。

解決方案1:

program-id. TestProgram. 
    working-storage section. 
    01 file-name  pic x(128). 
    01 file-lines  pic 9(9). 
    procedure division. 
     move 0 to file-lines 
     move "d:\rts_win32.txt" to file-name 
     call "program1" using file-name file-lines 
     display file-lines 
     stop run 
    end program TestProgram. 
program-id. Program1. 

    file-control. 
     select file-a assign to myfile 
      organization is line sequential. 

    data division. 
    fd file-a. 
    01 file-a-line  pic x(80). 

    working-storage section. 
    01 EOF-A   pic 9 value 0. 
    linkage section. 
    01 lk-filename  pic x(128). 
    01 CN-READ-A  pic 9(9). 
    procedure division using lk-filename 
          CN-READ-A. 

     move lk-filename to myfile 
     open input file-a 

     perform READ-A until EOF-A equals 1 
     close file-a 
     goback. 

     READ-A. 
     READ FILE-A 
      AT END 
      MOVE 1 TO EOF-A 
      NOT AT END 
      ADD 1 TO CN-READ-A 
     END-READ. 
     F-READ-A. 
     EXIT. 


    end program Program1. 

溶液2

program-id. TestProgram.: 
    working-storage section. 
    01 file-counter type FileLineCounter. 
procedure division. 
     set file-counter to new type FileLineCounter("d:\rts_win32.txt") 
     display file-counter::LineCount 
     stop run 
    end program TestProgram. 
class-id FileLineCounter. 
file-control. 
     select file-a assign to myfile 
      organization is line sequential. 

    data division. 
    fd file-a. 
    01 file-a-line  pic x(80). 

    working-storage section. 

    01 cn-read-a binary-long property as "LineCount". 

    method-id New. 
    01 EOF-A   pic 9 value 0. 
    procedure division using by value filename as string. 

     set myfile to filename 
     open input file-a 

     perform READ-A until EOF-A equals 1 
     close file-a 
     goback. 

     READ-A. 
     READ FILE-A 
      AT END 
      MOVE 1 TO EOF-A 
      NOT AT END 
      ADD 1 TO CN-READ-A 
     END-READ. 
     F-READ-A. 
     EXIT. 

    end method. 

    end class. 
+0

很好的解決方法。我會把這個開放幾天,看看有人知道更直接的方法,謝謝! – 2011-01-29 00:57:27

1

適當的Cobol參數化例程的方法是通過嵌套子程序。

你可以做你想做的事情,但它依賴於你的編譯器和環境,你可以傳遞一個文件,或者一個文件名或者一個DDname。

你在哪個平臺上?

編輯:在z/OS上,您可以使用putenv()在運行時更改FILE-A指向的內容,以調整與FILE-A使用的DDNAME關聯的數據集名稱。

參見: http://ibmmainframes.com/post-57281.html http://cicswiki.org/cicswiki1/index.php?title=How_do_I_allocate_a_file_dynamically_using_COBOL%3F

您將需要一個OPEN-A和CLOSE-A款以及之間的切換文件。

它並不是完全將參數傳遞給您的讀取語句,但它可以讓您針對不同文件重複使用OPEN/READ/WRITE/CLOSE語句。但只能連續使用。

有辦法,在VS COBOL II,在那裏你可以傳遞一個FD的子程序,會看起來像:

CALL MYREADPGM使用文件-A CALL MYREADPGM使用文件-B

這可能與企業Cobol但IIRC VisualAge不支持。

+0

我正在使用IBM的VisualAge。 – 2011-01-27 18:59:39

-1

您可以創建一個文件名的數據文件,將每個文件視爲一個單獨的記錄,然後讀取每個文件。在「SELECT ... ASSIGN」中,您需要爲文件名使用工作存儲變量,並將「文件名文件」中的值移入其中。

當您使用VisualAge時,我假定在UNIX中,您也可以從shell(sh,ksh)運行程序,並將文件名作爲參數運行,然後從shell中反覆運行程序文件名。

0

可能不是 「野生」,但與編譯器的支持,但目前ISO 20xx的標準草案包括FUNCTION-ID到位PROGRAM-ID的。它爲COBOL增加了一個參數友好的函數調用計算範例。

今天可能沒有幫助,但也許在不久的將來。如果我沒有弄錯,用戶定義的函數實際上來自COBOL 2002規範,但似乎編譯器供應商在支持該功能時碰到或錯過了。

功能-ID支持在OpenCOBOL 2.0的封閉式試驗中,但2.0版本的時間表未確定,可能在公佈之前還有一年或更長的時間。

相關問題