Integração do GnuCOBOL com o C

O compilador do GnuCOBOL transforma um programa fonte escrito em COBOL em um programa fonte escrito em C. Logo em seguida, compila e linkedita esse programa em C e gera um binário executável. A integração entre programas GnuCOBOL e C, portanto, não é complicada.

Mas essa integração exige atenção a alguns detalhes, relacionados principalmente passagem de parâmetros entre programas.

Diferenças no método de alocação de strings

Tanto o C quanto o GnuCOBOL alocam strings em memória como uma sequência de caracteres de tamanho fixo.

No COBOL, strings são alocadas com um tamanho fixo definido pela cláusula PICTURE, como no exemplo abaixo:

01 lastname pic x(015).

O C não possui um datatype string; ele considera que uma string é um um array de char onde cada elemento do array é um caracter. Da mesma forma que no COBOL, esse array tem um tamanho fixo. Em C, o exemplo acima poderia ser definido assim:

char lastname[15];

No entanto, para saber onde termina a string, o C espera encontrar um caracter nulo (x’00’) no final do array.

Ao enviar uma string como parâmetro para um subprograma em C, o programador deve atentar para esse detalhe e concatenar esse caracter nulo no final da string.

Por exemplo, se você quiser chamar um subprograma em C chamado “subc” passando um argumento pic x(020) chamado “param”:

...
01 param pic x(020).
...
string param x'00' delimited by size into param
call subc using param

Correspondência entre datatypes do C e datatypes do GnuCOBOL

Além dessa diferença no tratamento de strings, a troca de parâmetros entre um programa GnuCOBOL e um programa C também precisa considerar a correspondência entre os tipos de dados disponíveis nas duas linguagens.

A tabela abaixo mostra essa correspondência.

COBOL UsageEspaço ocupado
(em bytes)
Correspondente
em C
BINARY-CHAR
BINARY-CHAR UNSIGNED
1unsigned char
BINARY-CHAR SIGNED1signed char
BINARY-SHORT
BINARY-SHORT UNSIGNED
2unsigned
unsigned int
unsigned short
unsigned short int
BINARY-SHORT SIGNED2int
short
short int
signed int
signed short
signed short int
BINARY-LONG
BINARY-LONG UNSIGNED
4unsigned long
unsigned long int
BINARY-LONG SIGNED
BINARY-INT
4long
long int
signed long
signed long int
BINARY-C-LONG SIGNED8long
BINARY-DOUBLE
BINARY-DOUBLE UNSIGNED
8unsigned long long
unsigned long long int
BINARY-DOUBLE SIGNED
BINARY-LONG-LONG
8long long int
signed long long int

COMPUTATIONAL-1
4float
COMPUTATIONAL-28double
Sem equivalente no GnuCOBOL12long double
Tabela 1

Os USAGEs mostrados na tabela anterior seguem o padrão ANSI 2002 e devem ser usados sem PICTURE, como nos exemplos abaixo:

01 VARIAVEL-A USAGE BINARY-LONG SIGNED.
01 VARIAVEL-B USAGE BINARY-DOUBLE.

Fonte

CUTLER, Gary. Gnu COBOL 2.0 Programmers Guide. 2nd Edition. GNU General Public License, 2013.


Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *