COBOL - Comando CALL - www.cadcobol.com.br


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

CALL
  • Comando utilizado para chamar sub-programas é o CALL.
  • Este comando transfere o fluxo de execução para outro programa e aguarda o seu retorno para dar continuidade nos comandos após a sua utilização.
  • O comando CALL permite que se carregue um segundo programa na memória.
  • Desta forma, pode-se construir aplicações modulares, onde um programa com objetivos específicos será carregado na memória somente quando for necessário, economizando-se recursos do sistema operacional.

  • O primeiro programa é denominado "chamante" e o segundo programa, denominado "chamado".
  • Pode-se criar uma grande cadeia de programas chamantes e chamados, limitada apenas à memória disponível.
  • O comando CALL permite que se passe dados (parâmetros) entre os programas chamante e chamado, como veremos mais adiante.

Formato


identifier-1, literal-1
literal-1 deve ser um literal alfanumérico.
O identifier-1 deve ser um item de dados alfanumérico, alfabético ou numérico descrito em USAGE DISPLAY, para que seu valor possa ser um nome de programa.
As regras de formação para nomes de programas dependem da opção do compilador PGMNAME.
Para obter detalhes, consulte a discussão dos nomes de programas no parágrafo PROGRAM-ID e também a descrição de PGMNAME no Enterprise COBOL Programming Guide.
Nota de uso: Não especifique o nome de uma classe ou método na instrução CALL.

procedure-pointer-1
Deve ser definido com USAGE IS PROCEDURE-POINTER e deve ser definido como um ponto de entrada válido do programa; caso contrário, os resultados da instrução CALL serão indefinidos.
Depois que um programa é cancelado pelo COBOL, liberado por PL / I ou C ou excluído pelo assembler, qualquer ponteiro de procedimento definido no ponto de entrada desse programa não é mais válido.

function-pointer-1
Deve ser definido com USAGE IS FUNCTION-POINTER e deve ser definido como uma função ou ponto de entrada do programa válido; caso contrário, os resultados da instrução CALL serão indefinidos.
Após um programa ter sido cancelado pelo COBOL, liberado por PL / I ou C ou excluído pelo assembler, qualquer ponteiro de função que foi definido para essa função ou ponto de entrada do programa não será mais válido.

Quando o subprograma chamado for inserido no início da PROCEDURE DIVISION, o literal-1 ou o conteúdo do identifier-1 deve especificar o nome do programa do subprograma chamado.

Quando o subprograma chamado é inserido por meio de uma instrução ENTRY, o literal-1 ou o conteúdo do identifier-1 deve ser o mesmo que o nome especificado na instrução ENTRY do subprograma chamado.

USING

A frase USING especifica argumentos que são passados para o programa de destino.

Inclua a frase USING na instrução CALL apenas se houver uma frase USING no cabeçalho PROCEDURE DIVISION ou na instrução ENTRY através da qual o programa chamado é executado.
O número de operandos em cada frase USING deve ser idêntico.

A sequência dos operandos na frase USING da instrução CALL e na frase USING correspondente no cabeçalho PROCEDURE DIVISION do subprograma chamado ou na instrução ENTRY determina a correspondência entre os operandos usados pelos programas de chamada e chamada.
Essa correspondência é posicional.

Os valores dos parâmetros referenciados na frase USING da instrução CALL são disponibilizados para o subprograma chamado no momento em que a instrução CALL é executada.
A descrição dos itens de dados no programa chamado deve descrever o mesmo número de posições de caracteres que a descrição dos itens de dados correspondentes no programa de chamada.

As frases BY CONTENT, BY REFERENCE e BY VALUE se aplicam a parâmetros que os seguem até que outra frase BY CONTENT, BY REFERENCE ou BY VALUE seja encontrada.
BY REFERENCE será assumido se você não especificar uma frase BY CONTENT, BY REFERENCE ou BY VALUE antes do primeiro parâmetro.

BY REFERENCE

Se a frase BY REFERENCE for especificada ou implícita para um parâmetro, o item de dados correspondente no programa de chamada ocupará a mesma área de armazenamento que o item de dados no programa chamado.

identifier-2
Pode ser qualquer item de dados de qualquer nível na DATA DIVISION.
identifier-2 não pode ser um identificador de função.
Se estiver definido na LINKAGE SECTION ou FILE SECTION, você já deve ter fornecido a capacidade de endereçamento para o identifier-2 antes da chamada da instrução CALL.
Você pode fazer isso codificando um dos seguintes itens:
  • SET ADDRESS OF identifier-2 TO pointer
  • PROCEDURE DIVISION USING
  • ENTRY USING
file-name-1
Um nome de arquivo para um arquivo QSAM

ADDRESS OF identifier-2
o identifier-2 deve ser um item de nível 01 ou nível 77 definido na SEÇÃO LINKAGE.

OMITTED
Indica que nenhum argumento é passado.

BY CONTENT

Se a frase BY CONTENT for especificada ou implícita para um parâmetro, o programa chamado não poderá alterar o valor desse parâmetro, conforme mencionado na frase USING da instrução CALL, embora o programa chamado possa alterar o valor do item de dados referenciado pelo correspondente data- nome no cabeçalho PROCEDURE DIVISION do programa chamado.
Alterações no parâmetro no programa chamado não afetam o argumento correspondente no programa de chamada.

identifier-3
Pode ser qualquer item de dados de qualquer nível na DATA DIVISION.
O identifier-3 não pode ser um identificador de função ou um grupo ilimitado.
Se definido na LINKAGE SECTION ou FILE SECTION, você já deve ter fornecido a capacidade de endereçamento para o identifier-3 antes da chamada da instrução CALL.
Você pode fazer isso codificando uma das seguintes frases:
  • SET ADDRESS OF identifier-3 TO pointer
  • PROCEDURE DIVISION USING
  • ENTRY USING
    literal-2
    Pode ser:
    • Um literal alfanumérico
    • Uma constante figurativa (exceto ALL literal ou NULL / NULLS)
    • Um literal DBCS
    • Um literal national
    LENGTH OF
    Para obter informações sobre o registro especial LENGTH OF, consulte LENGTH OF (special_registers).

    ADDRESS OF identifier-3
    O identifier-3 deve ser um item de dados de qualquer nível, exceto 66 ou 88, definido na LINKAGE SECTION, na WORKING-STORAGE SECTION, ou na LOCAL-STORAGE SECTION.

    OMITTED
    Indica que nenhum argumento é passado.

    Para literais alfanuméricos, o subprograma chamado deve descrever o parâmetro como PIC X ( n ) USAGE DISPLAY, onde n é o número de caracteres no literal.

    Para literais DBCS, o subprograma chamado deve descrever o parâmetro como PIC G ( n ) USAGE DISPLAY-1 ou PIC N ( n )com USAGE DISPLAY-1 implícito ou explícito, em que n é o comprimento do literal.

    Para literais nacionais, o subprograma chamado deve descrever o parâmetro como PIC N ( n )com USAGE NATIONAL implícito ou explícito, em que n é o comprimento do literal.

    BY VALUE

    A frase BY VALUE se aplica a todos os argumentos que se seguem até serem substituídos por outra frase BY REFERENCE ou BY CONTENT.

    Se a frase BY VALUE for especificada ou implícita para um argumento, o valor do argumento será passado, não uma referência ao item de dados de envio.
    O programa chamado pode modificar o parâmetro formal que corresponde ao argumento BY VALUE, mas essas alterações não afetam o argumento porque o programa chamado tem acesso a uma cópia temporária do item de dados de envio.

    Embora os argumentos BY VALUE sejam destinados principalmente à comunicação com programas não-COBOL (como C), eles também podem ser usados para invocações de COBOL para COBOL.
    Nesse caso, BY VALUE deve ser especificado ou implícito para o argumento na frase CALL USING e o parâmetro formal correspondente na frase PROCEDURE DIVISION USING.

    identifier-4
    Deve ser um item de dados elementar na DATA DIVISION.
    Deve ser um dos seguintes itens:
    • Binário (USAGE BINARY, COMP, COMP-4 ou COMP-5)
    • Ponto flutuante (USAGE COMP-1 ou COMP-2)
    • Ponteiro de função (USAGE FUNCTION-POINTER)
    • Ponteiro (USAGE POINTER)
    • Procedimento-ponteiro (USAGE PROCEDURE-POINTER)
    • Referência de objeto (USAGE OBJECT REFERENCE)
    • Um caractere alfanumérico de byte único (como PIC X ou PIC A)
    • Um caráter national (PIC N), descrito como um item de dados elementar da categoria national.
    Os seguintes itens também podem ser passados por VALUE:
    • Item modificado por referência de USAGE DISPLAY e comprimento 1
    • Item modificado por referência de USAGE NATIONAL e comprimento 1
    • Registros especiais SHIFT-IN e SHIFT-OUT
    • Registro especial LINAGE-COUNTER quando for USAGE BINARY
    ADDRESS OF identifier-4
    O identifier-4 deve ser um item de dados de qualquer nível, exceto 66 ou 88, definido na LINKAGE SECTION, na WORKING-STORAGE SECTION, ou na LOCAL-STORAGE SECTION.

    LENGTH OF
    Um LENGTH OF registro especial passado por VALUE é tratado como um binário PIC 9 (9).
    Para obter informações sobre o registro especial LENGTH OF, consulte LENGTH OF (Special Registres).

    literal-3
    Deve ser de um dos seguintes tipos:
    • Um literal numérico
    • Uma constante figurativa ZERO
    • Um literal alfanumérico de um caractere
    • Um literal nacional de um caractere
    • Um caráter simbólico
    • Uma constante figurativa de byte único
      • SPACE
      • QUOTE
      • HIGH-VALUE
      • LOW-VALUE

    ZERO é tratado como um valor numérico; um zero binário de palavra completa é passado.

    Se o literal-3 for um literal numérico de ponto fixo, ele deverá ter uma precisão de nove ou menos dígitos.
    Nesse caso, uma representação binária de palavra completa do valor literal é passada.

    Se literal-3 for um literal numérico de ponto flutuante, uma representação interna de ponto flutuante (COMP-2) de 8 bytes do valor será passada.

    O literal-3 não deve ser um literal DBCS.

    RETURNING

    identifier-5
    O item de dados RETURNING, que pode ser qualquer item de dados definido na DATA DIVISION.
    O valor de retorno do programa chamado é implicitamente armazenado no identifier-5 .

    Você pode especificar a frase RETURNING para chamadas para funções escritas em COBOL, C ou em outras linguagens de programação que usem convenções de ligação em C.
    Se você especificar a frase RETURNING em um subprograma CALL to COBOL:

    • O subprograma chamado deve especificar a frase RETURNING no cabeçalho PROCEDURE DIVISION.
    • identifier-5 e o identificador correspondente de PROCEDURE DIVISION RETURNING no programa de destino devem ter as mesmas cláusulas PICTURE, USAGE, SIGN, SYNCHRONIZE, JUSTIFIED e BLANK WHEN ZERO (exceto que os símbolos de moeda da cláusula PICTURE podem diferir e os períodos e vírgulas podem ser trocados devido à cláusula DECIMAL POINT IS COMMA).

      Quando o destino retorna, seu valor de retorno é atribuído ao identificador-5 usando as regras para a instrução SET se o identificador-6 for útil INDEX, POINTER, FUNCTION-POINTER, PROCEDURE-POINTER ou OBJECT REFERENCE Quando o identifier-5 é de qualquer outro uso, as regras para a instrução MOVE são usadas.

    O item de dados CALL ... RETURNING é um parâmetro somente de saída.
    Na entrada para o programa chamado, o estado inicial do item de dados PROCEDURE DIVISION RETURNING possui um valor indefinido e imprevisível.
    Você deve inicializar o item de dados PROCEDURE DIVISION RETURNING no programa chamado antes de referenciar seu valor.
    O valor que é passado de volta ao programa de chamada é o valor final do item de dados PROCEDURE DIVISION RETURNING quando o programa chamado retorna.

    Nota: Se um programa COBOL retornar um item binário de palavra dupla por meio de um cabeçalho PROCEDURE DIVISION RETURNING para um programa COBOL de chamada com uma instrução CALL ... RETURNING, ocorrerá um problema se apenas um dos programas for recompilado com o Enterprise COBOL V5.
    Os programas chamados e de chamada devem ser recompilados com o Enterprise COBOL V5 juntos, para que a convenção de vinculação do item RETURNING seja consistente.

    Se ocorrer uma exceção ou excesso de fluxo, o identifier-5 não será alterado.
    O identifier-5 não deve ser modificado por referência.

    O registro especial RETURN-CODE não é definido pela execução de instruções CALL que incluem a frase RETURNING.

    ON EXCEPTION
    Uma condição de exceção ocorre quando o subprograma chamado não pode ser disponibilizado.
    Nesse momento, uma das duas ações a seguir ocorrerá:
    1. Se a frase ON EXCEPTION for especificada, o controle será transferido para imperative-statement-1 .
      A execução continua de acordo com as regras para cada instrução especificada na imperative-statement-1 .
      Se uma ramificação de procedimento ou instrução condicional que causa transferência explícita de controle for executada, o controle será transferido de acordo com as regras para essa instrução.
      Caso contrário, após a conclusão da execução da imperative-statement-1 , o controle será transferido para o final da instrução CALL e a frase NOT ON EXCEPTION, se especificada, será ignorada.
    2. Se a frase ON EXCEPTION não for especificada na instrução CALL, a frase NOT ON EXCEPTION, se especificada, será ignorada.
    NOT ON EXCEPTION
    Se uma condição de exceção não ocorrer (ou seja, o subprograma chamado pode ser disponibilizado), o controle será transferido para o programa chamado.
    Depois que o controle é retornado do programa chamado, o controle é transferido para:
    • imperative-statement-2 , se a frase NOT ON EXCEPTION for especificada.
    • O final da instrução CALL em qualquer outro caso. (Se a frase ON EXCEPTION for especificada, ela será ignorada.)
    Se o controle for transferido para a imperative-statement-2 , a execução continuará de acordo com as regras para cada instrução especificada na imperative-statement-2 .
    Se uma ramificação de procedimento ou instrução condicional que causa transferência explícita de controle for executada, o controle será transferido de acordo com as regras para essa instrução.
    Caso contrário, após a conclusão da execução da imperative-statement-2 , o controle é transferido para o final da instrução CALL.

    ON OVERFLOW
    A frase ON OVERFLOW tem o mesmo efeito que a frase ON EXCEPTION.

    END-CALL
    Esse terminador de escopo explícito serve para delimitar o escopo da instrução CALL.
    END-CALL permite que uma instrução CALL condicional seja aninhada em outra instrução condicional.
    END-CALL também pode ser usado com uma instrução CALL imperativa.

    Vantagens de chamar subprogramas
    • Evita duplicação de esforço.
      Quando os módulos precisam ser incluídos em mais de um programa, é melhor escrevê-los separadamente e chamá-los em cada programa, quando necessário.
    • Aumenta a produtividade do Desenvolvedor.
      Os Desenvolvedores podem "especializar" ou codificar módulos que façam uso de seus talentos ou habilidades específicas.
    • Fornece maior flexibilidade.
      Os subprogramas podem ser escritos em qualquer linguagem de programação; geralmente eles são escritos em uma linguagem mais
      adequada à tarefa específica exigida.
    • Podem ser feitas modificações no programa chamado sem que haja necessidade de modificar o programa chamador
    • Resulta em uma maior padronização
    • Sempre defina uma chamada CALL dinâmicamente ou seja:
      definada na WORKING-STORAGE SECTION uma variável com o nome do programa a ser chamado CALL variavel-da-working using parâmetros e nunca estáticamente ou seja:
      CALL "PROGRA01" using parâmetros