Есть ли способ параметризации функций в COBOL? - PullRequest
4 голосов
/ 27 января 2011

Я кодирую подпрограммы, такие как:

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.

, чтобы прочитать несколько файлов, и мне было интересно, есть ли способ кодировать подпрограмму, которая может прочитать имя файла из переменной, поэтому я недолжны кодировать то же самое для каждого файла.Спасибо!

Ответы [ 4 ]

2 голосов
/ 29 января 2011

Одним из решений, как указано выше, является использование нескольких программ или вложенных программ, для которых Я включил пример ниже, который является решением 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.
1 голос
/ 27 января 2011

Правильный способ параметризации подпрограмм Cobol - через вложенную подпрограмму.

Вы можете делать то, что вы хотите, но это зависит от вашего компилятора и среды, вы можете передать файл, или имя файла, или DDname.

На какой платформе вы находитесь?

Редактировать: В z / OS вы можете изменить то, на что указывает FILE-A во время выполнения, используя putenv (), чтобы настроить имя набора данных, связанное с DDNAME, котороеFILE-A использует.

См .: 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, используя FILE-A CALL MYREADPGMИСПОЛЬЗОВАНИЕ FILE-B

Это возможно для Enterprise Cobol, но IIRC VisualAge не поддерживает это.

0 голосов
/ 17 января 2013

Может пока не быть «в дикой природе» с поддержкой компилятора, но текущий стандарт ISO Draft 20xx включает в себя FUNCTION-ID вместо PROGRAM-ID. Он добавляет в COBOL парадигму вычисления вызова функции с учетом параметров.

Может не помочь сегодня, но, возможно, в ближайшем будущем. Если я не ошибаюсь, Определяемые пользователем функции на самом деле взяты из спецификации COBOL 2002, но кажется, что поставщики компиляторов недовольны поддержкой этой функции.

Поддержка FUNCTION-ID находится в закрытых испытаниях для OpenCOBOL 2.0, но график выхода версии 2.0 не определен и может быть еще год или больше, прежде чем он будет обнародован.

0 голосов
/ 28 января 2011

Вы можете создать файл данных с именами файлов, обрабатывать каждое из них как отдельную запись, а затем читать каждый файл.В «SELECT ... ASSIGN» вам нужно будет использовать переменную рабочего хранилища для имени файла и переместить значение из «файла имен файлов» в него.в UNIX вы также можете запускать программу из оболочки (sh, ksh) с именем файла в качестве параметра и многократно запускать программу из оболочки для каждого имени файла.

...