Ir ao conteúdo

Delay() Range check error while evaluating constants


Visitante: NickAlvesX

Posts recomendados

Visitante: NickAlvesX
 
Postado

Então galera, eu fiz um programa que tem de atualizar de tempo em tempo a partir do horário que o usuário DIGITA no programa.

Ex: Digita 13 e depois 12 (guardo em "h" e "m")

Fiz no Pascalzim e rodou que é uma beleza. Até ai eu não tinha problemas. Eu quis implementar a função Gettime() no Pascalzim pra evitar que o usuário tivesse de digitar a hora e ficasse mais automático o procedimento, mas descobri que o Pascalzim não compila o Gettime, então baixei outros compiladores. Comecei com o Free Pascal, e o Gettime funcionou, mas no Delay ele me retornou um erro que não estava ocorrendo no Pascalzim:

"Range check error while evaluating constants" (O Delay estava com valor de 300000, que é para atualizar depois de 5 minutos).

Ele não quis compilar com esse erro. Eu pesquisei em diversos lugares o que esse erro significa e acho que é porque o número é muito grande.

Quando eu abro uma procedure para Delay e coloco como Longint ou Cardinal, ele compila, mas atualiza tudo de uma vez e desrespeita o tempo de 5 minutos (300000).

Já tentei com FPC, FPS, Turbo Pascal, Delphi, Lazarus... NENHUM FUNCIONA O DELAY COM ESSE VALOR. Incrivelmente, só o Pascalzim.

Questões:

Porque o Pascalzim reconhece e os outros compiladores não?

Tem alguma forma de fazer com que o Delay(300000) funcione normalmente?

(Já declarei uses crt)

Tem outro modo de pausar o programa? (sem ser o Sleep, da na mesma).

Esse erro me irrita! E preciso de uma resposta urgente pra prosseguir com meu TCC!

Espero que possam me ajudar de verdade, grato desde já!

Postado

NickAlvesX,

O jeito seria implementar uma versão personalizada do Delay(). Você criaria uma rotina (uma PROCEDURE) e usaria um laço de repetição para processar o Delay com parâmetros menores. Por exemplo, um laço de 1 até 5 repetindo o Delay(60000) daria o resultado esperado: 5 minutos.

Existem várias formas de fazer isso.. Se por algum motivo precisar trabalhar com números grandes, use o tipo Longint.

[]'s

NW

Visitante: NickAlvesX
 
Postado

Obrigado pela ajuda! Vou testar aqui. :)

Qual é a procedure que eu tenho que abrir pra declarar milliseconds?

Ex: procedure delay(ms: (o que eu devo colocar aqui?));

Postado

NickAlvesX,

Obrigado pela ajuda! Vou testar aqui. :)

Qual é a procedure que eu tenho que abrir pra declarar milliseconds?

Ex: procedure delay(ms: (o que eu devo colocar aqui?));

Você precisa criar um novo procedimento no seu programa. Como você já está terminando a sua faculdade, então muito provavelmente sabe criar procedimentos/funções em Pascal. Já está íntimo nesse assunto. Vou mostrar o esqueleto de um programa completo utilizando um procedimento:

program foo;

uses
CRT;

procedure DelayMin(Minutos: integer);
var
i: integer;
begin
(...) - Implemente o laço FOR aqui dentro com o Delay(60000).
end;

begin
(...)
DelayMin(2); { Exemplo: causa um atraso de 2 minutos. }
(...)
end.

Se por um acaso desejar utilizar valores em Milissegundos, então vai precisar usar o tipo Longint e implementar alguns cálculos dentro do laço de repetição.

Moleza? Tranquilo?

[]'s

LNW

Visitante: NickAlvesX
 
Postado

Tranquilo! Já consegui aqui... Os laços eu sabia, só que como eu já tinha dito o Longint não tava indo, mas valeu mesmo a ajuda! Problema resolvido.

  • Membro VIP
Postado

Só um adendo...

Se por um acaso desejar utilizar valores em Milissegundos, então vai precisar usar o tipo Longint e implementar alguns cálculos dentro do laço de repetição.
Tranquilo! Já consegui aqui... Os laços eu sabia, só que como eu já tinha dito o Longint não tava indo, mas valeu mesmo a ajuda! Problema resolvido.

Pelo que consta o Delay() já trabalha em milissegundos, ou seja, somente será necessário verificar o "limite de tempo". Então, cada compilador tem as suas particularidades, no Turbo Pascal por exemplo, o Delay() só suporta valores do tipo Word.

Word 0..65535 Unsigned 16-bit

Logo, o maior "delay" que se pode dar de uma vez é de 65535 milissegundo. Daí, como sugerido por LNW, você poderia utilizar vários Delay() com valores entre essa faixa, de modo que o resultado final se equipare com o desejado.

Resumidamente: Em nível de tipo de variáveis, esse LongInt se refere ao parâmetro da procedure, enquanto o tipo da variável do Daley() continuará sendo do tipo Word (isso não muda), ou seja, o comando receberá uma LongInt com o total de milissegundo, o internamente será calculado e executados vários Daley() com valores menores para corresponder a esses milissegundos.

Ex.:

128.500 milissegundo, daria por exemplo 2 vezes um Delay() de 60.000 e outro de 8.500.

Abraços

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...