Programação Adicional

Outro Programa

Aqui está um programa um pouco mais complicado, digite-o em um arquivo e salve-o como addition.cob.

       IDENTIFICATION DIVISION.
       PROGRAM-ID.    addition.
       ENVIRONMENT DIVISION.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  myvar PIC 999 .
       77  a  PIC 99V999 VALUE 1.777 .
       77  b  PIC 99V99  VALUE ZERO .
       77  c  PIC 9V9    VALUE 5.5 .
       77  d  PIC 9v9    VALUE 5.5 .
          
       PROCEDURE DIVISION.
           DISPLAY "Por favor insira um número"
           ACCEPT myvar
           DISPLAY "O número é ", myvar
           ADD a TO b ROUNDED
           DISPLAY "b is ", b
           ADD c TO d
           DISPLAY "d is ", d
           STOP RUN.

Você pode compilar este com a mesma rotina, a qual você usou com hello.cob, se você encontrou alguma falha de segmentação, cheque duplamente seu programa antes de se queixar.

Se você é novo com o Cobol, há um ponto para se tomar aqui. Primeiramente nós temos variáveis declaradas na WORKING-STORAGE SECTION na DATA DIVISION. O Cobol requer que todas as variáveis sejam declaradas desta maneira. As outras seções da DATA DIVISION lidam com arquivos e linkage.

As variáveis declaradas aqui iniciam com '77'. Isso significa que a variável está no nível 77: ele não tem estrutura interna e num relacionamento definido com nenhuma outra variável. Ele não é um parte de um registro(ou qual as estruturas de chamadas C). O Nome da primeira variável é myvar, nome das variáveis podem ser letras maiúsculas ou minúsculas, mas com o TinyCobol você deve ser consistente em todas as partes do seu programa.

A cláusula PIC especifica o tipo da variável. Usando "9s", significa que ela é uma variável decimal e usando 3"9s", cria uma variável que recebe os números 0 a 999. Você pode ter também um S antes do "9s" para criar uma variável com sinal. Um 'V' na declaração PIC significa uma variável com um ponto decimal assumido na posição V. Para variáveis grandes, você pode escrever 9(15), que é uma variável que tem 15 espaços. Usando "As" ao invés de "9s", criamos uma variável alfabética e usando "Xs" para criar uma variável alfanumérica. Finalmente um VALUE inicial pode ser indicado para a variável.

Programadores Cobol inexperientes podem estar preocupados como o final de um parâmetro é marcado. O final dos blocos são marcados com uma parada completa, mas os parâmetros não são marcados definitivamente. Ao invés disso o compilador Cobol reconhece quando um novo parâmetro se inicia ao notar um grande número de verbos Cobol. O final das linhas não é importante no Cobol. Outra coisa para notar no código acima é as vírgulas adicionadas. Vírgulas são completamente opcionais, você pode inserí-las no lugar que você preferir ou em lugar nenhum que não fará diferença. Use-as com moderação e elas farão seu programa ficar mais caprichado.

Quando executar o programa, ele deve perguntar a você por um número, então irá mostrar este número ao longo de dois outros cálculos que ele acabou de realizar. O número dado não pode ser maior que 3 espaços alocados para ele, senão somente os três caracteres finais que são dados, se ele são dados menos que 3 caracteres, então mostrará zeros primeiro. Caracteres não numéricos irão mostrar algum código de debug.

A adição das variáveis a e b devem mostrar um bom funcionamento, embora você note que a resposta é arredondada, como nós pedimos. Adicionando c e d não fará coisa alguma, desde que a resposta seja muito grande para adequar-se na variável d. Tente mudar c para, digo, 1.5 e tudo irá funcionar muito bem.

Make

Por agora você pode obter um pequeno aborrecimento com as rotinas htcobol, as e gcc. Bom há um caminho melhor, make. O make exige um arquivo chamado Makefile e usa as instruções para funcionar que necessitamos compilar em um simples passo. Ele também checa se o arquivo necessita de compilação antes de ele fazer qualquer coisa, se nenhuma das dependências dos programas foram modificados desde a última compilação, nenhum sendo feito.

As regras do makefile são da seguinte forma:

alvo:dependências
	  comando

O alvo(que deve iniciar na primeira coluna) é o arquivo que você está tentando obter. As dependências são os arquivos dos quais ele depende. O comando(que deve ser a segunda linha e precedida por um tab) é o comando que você normalmente, digita no shell para fazer seu arquivo. Aqui está um makefile para addition:

#um simples makefile para um programa cobol

addition:addition.o
	gcc -o addition addition.o -lhtcobol -lm

addition.o:addition.s
	as -o addition addition.s

addition.s:addition.cob
	htcobol addition

Salve o como makefile neste mesmo diretório como addition.cob e digite make. Ele deve compilar, assemblar e linkar para você.

Por default, make irá compilar a primeira regra no arquivo. Este é para criar o binário addition, mas este depende do addition.o que para fazer addition.o depende do addition.s. Então este é o primeiro comando que o make executa. Agora ele cria addition.o e finalmente addition.o está pronto para criar addition. Se você tentar digitar make novamente, não irá fazer coisa alguma, por que nenhum dos arquivos foi modificado então não há necessidade (o make olha o arquivo timestamp para determinar isso), mude addition.cob bem de leve e execute make e todo o processo executará novamente.

Make Avançado

Mas o makefile anterior tem um problema: e se você quiser adaptá-lo para trabalhar com um outro programa? há bastante mudanças em addition para fazê-lo e com um programa mais complicado que irá pedir tempos. Felizmente make tem muitas complexidades na manga. Aqui está um makefile avançado:

#makefile para um programa cobol composto de um único arquivo.

PROGRAM := addition
LIBS := -lhtcobol -lm
OBJECTS := $(PROGRAM).o

$(PROGRAM):$(OBJECTS)
	gcc -o $(PROGRAM) $(OBJECTS) $(LIBS)

#regras para os mesmos arquivos terminados em .o
#depende do arquivo com mesmo prefixo com .s
# $@ é o alvo
%.o:%.s
	as -o $@ $<

%.s:%.cob
	htcobol $(PROGRAM)

O makefile inicia com algumas variáveis. PROGRAM é o nome do programa que nós estamos criando. Você pode ver se ele está sendo usado na primeira regra(precedido por um sinal de dólar delimitado com parênteses). LIBS é justamente as bibliotecas que nós precisamos para compilar o programa. OBJECTS é alguns arquivos objetos necessários, neste caso é exatamente um, e que possui o mesmo nome com um .o no final, que é justamente como ele é declarado.

A segunda regra combina os alvos terminados em .o (%.o) e ele requer o mesmo arquivo com um sufixo .s (%.s como uma dependencia). A variável automática $@ iguala o nome do alvo e $< iguala a primeira dependência. Por agora você deve estar também trabalhando o seu caminho até o alvo final.

Se você quiser adaptar este makefile para outro programa COBOL, tudo que você tem que fazer é mudar o valor da variável $PROGRAM.