READ PARAMETERS from command line

hey,
i have to write a program that gets 1 to 5 parameters.
Is there a possibility to get the count of the parameters before reading they with accept?

I am using gnu-cobol.

thanks
Dirk

Hello

I don’t know “gnu-cobol” so I can’t help you technically, but your solution is not necessarily technical, for example:

  1. you could reserve the first character of the first parameter to contain this number of parameters to apply

  2. if you can, it’s preferable to externalise the parameters (so they could be modified without modifying any code) in a file of a table and the first line could contain the number or parameters to apply

anyway, it’s better to have the number of parameters to apply somewhere to check if the good number of parameters has been provided correctly

Typically, there multiple ways to get this information into your program.

Control Cards are sometimes read into programs for runtime parms.
You can use the “ACCEPT” cobol keyword to take parms in directly from the operator (not best practice anymore).
You use Linkage and use of PARMS on your JCL used to execute the program. This is very standard and I show a piece of code from: Simotime


   LINKAGE SECTION.
   01  PARM-BUFFER.
       05  PARM-LENGTH         pic S9(4)   comp.
       05  PARM-DATA           pic X(256).

  *****************************************************************
   PROCEDURE DIVISION using PARM-BUFFER.
       if  FIRST-TIME not = 'N'
           perform Z-POST-COPYRIGHT
           move 'N' to FIRST-TIME
       end-if

       add PARM-LENGTH to ZERO giving JCL-PARM-LENGTH
       move MESSAGE-TEXT-01 to MESSAGE-TEXT
       perform Z-POST-MESSAGE

       if  PARM-LENGTH > 0
           move PARM-DATA(1:PARM-LENGTH) to MESSAGE-TEXT
           perform Z-POST-MESSAGE
       end-if

       perform Z-THANK-YOU.

       GOBACK.

A few suggestions.

  1. Change the file type from ACCEPT to READ. That way, you can see the AT END of file which will prevent further reading.
  2. Use the first ACCEPT to indicate the number of lines following it.
  3. Use the PARM to indicate the number of lines to be read.
  4. Pass all the parameters using the PARM.
    I see the use of the ACCEPT statement as poor programming. Accepting more statements than in the file can cause an abend. Use the READ instead.

Prezados,

     Não sei quanto a quantidade de parâmetros, mas com certeza, podemos identificar a quantidade de caracteres recebidos nos parâmetros, uma vez que "PARM-LENGTH" indica a quantidade de caracteres recebidos.

     Um dos grandes recursos "NOVOS" do COBOL II foi o "LENGTH OF", que nos permite identificar o tamanho real de uma variável em memória.

      Logo se seus 5 parâmetros somam 15 posições você pode checkar se a quantidade de caracteres recebidos é compatível com a quantidade de caracteres esperados pela definição da variável(eis) no código.

       É por esta razão que sempre que me é permitido, em programas CICS, utilizo as seguintes instruções:

01 DFHCOMMAREA.
03 FILLER OCCURS 32768 DEPENDING ON EIBCALEN PIC X(01).

01 COMMAREA-PROG-XYZ.
03 campo1 pic x(02).
03 campo2 pic x(100).
03 campo3 pic x(50).

Posiciono a “Mascara COMMAREA-PROG-XYZ” no endereço inicial de DFHCOMMAREA, logo, ambas estão posicionadas na mesma posição de memória, com definições lógicas distintas.
SET ADDRESS COMMAREA-PROGRAMA-XYZ TO ADDRESS DFHCOMMAREA.

Pergunto se a quantidade de caracteres recebidos é igual ao EIBCALEN, uma vez que, se não forem, o programa deve ser interrompido por falta de “syncronismo” entre as informações recebidas e esperadas pelo Objeto COBOL CICS.

Logo, em meu empírico entendimento, estes dois foram os comandos mais importantes disponibilizados pelo COBOL II.
SET ADDRESS
LENGTH OF

Além do “SET” e do “LENGTH OF” devemos chamar a atenção para o MOVE “STRING”, que potencialmente elimina a formatação rígida de dados pelo COBOL, isto é, posso criar, por exemplo, uma ÁREA DE COMUNICAÇÃO entre programas e plataformas, com tamanho dinâmico. Algo impossível antes desta evolução do comando MOVE.
MOVE A (p:t) TO B (y;t)
Onde:
p -> Indica a Posição Inicial da Informação na variável de origem A
t -> Indica o Tamanho da Informação
y -> indica a Posição Inicial da Informação na variável destino B

Nos STRINGs dinâmicos antes de cada parte variável deve existir uma parte fixa que indica o tamanho da variável.