Ir para conteúdo
  • Cadastre-se

dev botao

Divisão por zero não está gerando exceção


  • Este tópico foi criado há 1968 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Problema começou a ocorrer em 8/8/2018.

      Após atualização diversas no Windows 7 e no ACBr comecei a ter problemas pois as exceções de divisão por zero pararam de ocorrer,  algo simples  como:

var
  a,b,c: real;
begin
  a := 10;
  b := 0;
  c := a / b;
end;

      Simplesmente "passava batido" inclusive ao debugar, e curiosamente  "c"  retornava com o valor INF que é a constante Infinity.

      O projeto foi testado em máquinas diferentes com versões do Delphi também diferentes Seattle e Tokyo, (o que me tomou um tempo lascado) pois desconfiada que pudesse ser um problema no compilador ou na máquina e depois no meu projeto; mas tudo atualizado até o último bit  e e o problema persistiu.
 
      Um projeto novo, em ambas as máquinas, gerava a exceção, diferentemente do projeto existente que insistia em trazer a constante INF.

      Após pensar em largar tudo e fazer medicina (kkk), desmantelei o projeto existente e ao retirar os componentes do ABCr as exceções voltaram a ocorrer.

      Investigando mais a fundo notei que quando se utiliza a linguagem C o padrão de retorno são as constantes, e isso é válido para objetos COM e eventualmente DLL que possamos acessar.

      Então acredito que alguma DLL que eu esteja utilizando nesse projeto onde utilizo o ACBr (NFe, SAT e Extrato com o Fortes Report)   modifica o controle de ponto flutuante do processador para que ele faça o que é chamado de "mascaramento de exceção".

      Essa modificação persiste e afeta o meu projeto como um todo.

      Lendo um pouco mais, aparentemente esse problema só ocorre nos ambientes de 32 bits. Após  3 dias, lendo e pesquisando, para resolver a questão coloquei no form create a seguinte rotina:

      set8087cw(4978);

      Essa camaradinha aí em cima controla a precisão dos cálculos de ponto flutuante e esse valor 4978 (hex  $1372) 

      define "mostrar todas as exceções" eu não sabia e para achá-lo utilizei a função get8087cw(word),

       depois pesquisando mais um pouco encontrei a informação.

 

Feito isso as exceções voltaram a aparecer... Agora é só esperar o próximo comportamento esquisito, do nada, aparecer.

Se eu escrevi alguma bobagem e alguém souber mais sobre esse assunto por favor contribuam para que possamos aprender um pouco mais.

 

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_Set8087CW.html



 

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Moderadores
Em 01/09/2018 at 02:27, [email protected] disse:

Olá Daniel, checadas as configurações do ACBr.inc informo que elas não interferem em nada nessa questão.  

Boa tarde, [email protected].

Tópico antigo. Sugiro que crie um novo, relatando sua dúvida ou problema.

  • Curtir 1
Equipe ACBr

Felipe Eduardo Resende Mesquita

Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Reabri o tópico pois ainda se trata do mesmo assunto.

Em 12/08/2018 at 12:24, [email protected] disse:

Se eu escrevi alguma bobagem e alguém souber mais sobre esse assunto por favor contribuam para que possamos aprender um pouco mais. 

Na verdade você não disse nenhuma bobagem. Existe esse negócio chamado "8087 Control Word". É de controle do processador.
Só de carregar uma DLL algum comportamento nesse sentido pode ser alterado.

Veja esse post feito pelo principal mantenedor do GExperts atualmente que passou por uma situação bem semelhante:

https://blog.dummzeuch.de/2018/09/06/if-your-floating-point-calculations-differ-after-a-trivial-change/

 

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

16 horas atrás, EMBarbosa disse:

Reabri o tópico pois ainda se trata do mesmo assunto.

Na verdade você não disse nenhuma bobagem. Existe esse negócio chamado "8087 Control Word". É de controle do processador.
Só de carregar uma DLL algum comportamento nesse sentido pode ser alterado.

Veja esse post feito pelo principal mantenedor do GExperts atualmente que passou por uma situação bem semelhante:

https://blog.dummzeuch.de/2018/09/06/if-your-floating-point-calculations-differ-after-a-trivial-change/

 

Como não pretendo alterar as rotinas que carregam as DLL vou ficar com o comando   set8087cw(4978);  no meu código fonte.

Barbosa, se você puder sugerir aos responsáveis pelo código que carrega as DLL de utilizarem "LoadSafeLibrary"

ao invés de "LoadLibrary" como o Thomas Mueller sugere, de repente, evitamos futuros efeitos colaterais.


Obrigado por seu post.

Link para o comentário
Compartilhar em outros sites

  • Consultores
1 hora atrás, [email protected] disse:

Barbosa, se você puder sugerir aos responsáveis pelo código que carrega as DLL de utilizarem "LoadSafeLibrary"

ao invés de "LoadLibrary" como o Thomas Mueller sugere, de repente, evitamos futuros efeitos colaterais.

Seria necessário saber exatamente quais dlls estão causando esse problema. Você conseguiu identificar?

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

1 hora atrás, EMBarbosa disse:

Seria necessário saber exatamente quais dlls estão causando esse problema. Você conseguiu identificar?

Olá Barbosa,

   Não consegui identificar quando tive o problema.

   Acredito que são muitas as DLL envolvidas, cada projeto pode utilizar um conjunto diferente, 

para criptografia, forma de envio, relatórios, etc. 

   Não sei se o ACBr utiliza a função "LoadLibrary" para carregar as DLL,

caso utilize minha sugestão é padronizar para "LoadSafeLibrary".

   Se achar viável e me der uma orientação básica posso fazer a modificação em cada um

dos arquivos nos fontes e subir para vocês avaliarem.

   Fico à disposição..

Editado por [email protected]
Link para o comentário
Compartilhar em outros sites

  • Consultores
18 minutos atrás, [email protected] disse:

 Não sei se o ACBr utilizar a função "LoadLibrary" para carregar as DLL,

caso utilize, minha sugestão é padronizar para "LoadSafeLibrary".

   Se achar viável e me der uma orientação básica posso fazer a modificação em cada um

dos arquivos nos fontes e subir para vocês avaliarem.

   Fico à disposição.. 

Teria mesmo que procurar nos arquivos do ACBr, alterar e testar. Depois anexar aqui os arquivos alterados.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Administradores

Tópico fechado por falta de retorno do usuário

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1968 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...