2011-01-27 103 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版本的时间表未确定,可能在公布之前还有一年或更长的时间。

相关问题