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
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:
you could reserve the first character of the first parameter to contain this number of parameters to apply
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.
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.