
Captulo 30 - desvios de programa

GOTO - o comando GOTO permite um desvio incondicional para um pargrafo do
programa, o qual deve ser mencionado na declarao de LABEL do programa
e desta forma o controle do programa perder sua sequncia natural.  desa-
conselhvel o uso deste comando em programao estruturada, no sendo sequer
mencionado em muitas literaturas. Este comando no permite desvios para fora
de um procedimento ou funo. Sua sintaxe:
GOTO label;
Vejamos um exemplo:
PROGRAM teste_goto;
LABEL
  fim, incio, erro;
VAR
  i : BYTE;
  ch ; CHAR;
BEGIN
  incio :
  WRITE (digite um nmero maior que 20);
  READLN (i);
  IF i > 20
    THEN
      GOTO fim
  ELSE 
    goto erro;
  erro :
  WRITELN (voc no digitou um nmero maior que 20);
  fim : 
  WRITE (deseja digitar outro nmero S/N?? );
  READLN (ch);
  IF UPCASE (ch) = S
    THEN
      GOTO incio;
END.

EXIT - este procedimento faz com que o programa termine o bloco que est
sendo executado e se for o bloco principal do programa, ser encerrado. 
Sua sintaxe:
EXIT;
Exemplo:
PROGRAM teste_exit;
USES CRT;
PROCEDURE repete;
BEGIN
  REPEAT
    IF KEYPRESSED 
      THEN
        EXIT;
  WRITE (#$);
  UNTIL FALSE;
END;
BEGIN
  repete;
END.

RUNERROR - este procedimento causa o trmino do programa no local onde es-
tiver sendo executado, gerando um erro de execuo com o mesmo valor passado
como parmetro. Caso o parmetro seja omitido, o valor de erro de execuo
ser 0. Se as informaes de Debuging estiverem ligadas (veja diretivas de
compilao), este procedimento ser executado pelo Turbo. Sua sintaxe:
RENERROR [(<valor>; BYTE)];
Vejamos um exemplo:
PROGRAM teste_runerror;
CONST
  p = NIL;
BEGIN
  IF p = NIL
    THEN
      RUNERROR (204);
END.

HALT - este procedimento causa o trmino do programa no local onde estiver
sendo executado, gerando um erro de execuo com o mesmo valor passado como
parmetro. Caso o parmetro seja omitido, o valor do erro de execuo ser 
0, quando do trmino do programa, este vai para o Sistema Operacional. 
O valor de erro pode ser tratado em arquivos em BATCH.BAT com a opo 
ERRORLEVEL. Sua sintaxe:
HALT ([<valor> : WORD]);
Vamos ver um exemplo:
PROGRAM teste_halt;
USES CRT;
VAR
  ch : CHAR;
BEGIN  
  ch := UPCASE (READKEY);
  HALT (ORD(ch));
  WRITELN (esta frase nunca ser executad);
END.
  Este exemplo deve ser compilado em disco e utilizado em conjunto com um
arquivo em Batch do DOS. Poderia ser como segue:
nome MENU.BAT, contedo
ECHO OFF 
:INCIO
CLS
ECHO DIGITE SUA OPO
ECHO (A) - CHECAGEM DO DISCO
ECHO (B) - FORMATA DISCO A COM SISTEMA
ECHO (C) - FORMATA DISCO A SEM SISTEMA
ECHO (D) - BACKUP
ECHO (E) - FIM
LETECLA;
IF ERRORLEVEL = 70 ERR0
IF ERRORLEVEL = 69 GOTO FIM
IF ERRORLEVEL = 68 GOTO PRG4
IF ERRORLEVEL = 67 GOTO PRG3
IF ERRORLEVEL = 66 GOTO PRG2
IF ERRORLEVEL = 65 GOTO PRG1
:ERRO
ECHO OPO INVLIDA
PAUSE
GOTO INCIO
:PRG1
CHKDSK
GOTO OUTRO
:PRG2
FORMAT A: /S/V
GOTO OUTRO
:PRG3
FORMAT A : /V
GOTO OUTRO
:PRG4
DISKCOPY A: B:
:OUTRO
ECHO DESEJA NOVA TAREFA S/N???
LETECLA
IF ERRORLEVEL = 84 GOTO FIM
IF ERRORLEVEL = 83 GOTO INCIO
:FIM
ECHO ON
