Compilador Harbour com bug ao fazer comparações!

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Compilador Harbour com bug ao fazer comparações!

Mensagem por NiltonGM »

Prezados,
O compilador Harbour está com bug estranho ao fazer comparações seja de variáveis ou Value de componentes, no principio achei q era um bug da class TMySQLQuery(), mas não é, ocorre o seguinte no exemplo simples abaixo para entender:

/* inicio ***********************

cAlterou := "" // Vazio

if "fjsdkfsdfd" != "" // Aqui está considerando iguais (estranho pra caramba), retorna .F. (troquei o != para <> mas não funcionou também)
cAlterou := 'ALTERADO"
end

? cAlterado // Retorna "" // Extranho

*Fim***/
Para contornar esse problema tive que fazer dessa forma:
/** Inicio ***

if !("fjsdkfsdfd" == "") // Aqui está considerando diferentes (óbvio), retorna .T.
cAlterou := 'ALTERADO"
end

? cAlterado // Retorna "ALTERADO" // Funciona!!

Uso HMG 3.3.1 compilando aplicativos em 32bits
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Compilador Harbour com bug ao fazer comparações!

Mensagem por Jairo Maia »

Olá Nilton,

Confirmo! Compilado com Harbour 3.0 e Harbour 3.2.

Também um bug com Matriz que se mantém no Harbour e vem desde o Clipper é este:

Código: Selecionar todos

aTeste := {}
AaDd( aTeste, "1234" )
AaDd( aTeste, "abcd" )
AaDd( aTeste, "ABCD" )
? AScan( aTeste, "" )  // retorna 1
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Compilador Harbour com bug ao fazer comparações!

Mensagem por Itamar M. Lins Jr. »

Ola!
! use HB_ASCAN( x, y,,, .T. ) to avoid relying on _SET_EXACT
% use ASCAN() instead of HB_ASCAN() if Harbour extension are not used (hbdoc)

Código: Selecionar todos

Function main
aTeste := {}
AaDd( aTeste, "1234" )
AaDd( aTeste, "abcd" )
AaDd( aTeste, "ABCD" )
? hb_AScan( aTeste, "",,,.t. )  // retorna 0
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Compilador Harbour com bug ao fazer comparações!

Mensagem por Jairo Maia »

Olá Itamar,

Esta foi a solução encontrada desde o Clipper, mas continua extranho pois não acho que precisa ser comparação exata para saber que "fjsdkfsdfd" é diferente de "", e que na Matriz não há elemento vazio. Muito extranho.

Código: Selecionar todos

lExact := Set(_SET_EXACT, .t. )

cAlterou := ""
If "fjsdkfsdfd" != ""
 cAlterou := "ALTERADO"
end
? cAlterou  // retorna ALTERADO (correto)

aTeste := {}
AaDd( aTeste, "1234" )
AaDd( aTeste, "abcd" )
AaDd( aTeste, "ABCD" )
? AScan( aTeste, "" )  // retorna 0 (correto)

Set(_SET_EXACT, lExact )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Compilador Harbour com bug ao fazer comparações!

Mensagem por Itamar M. Lins Jr. »

Ola!
Eu perguntei ao Viktor se é um comportamento normal.
O Viktor respondeu.
No caso da ascan, usar hb_ascan(,,,,.t.) Já no != (not equal) leia abaixo:
Yes, unfortunately. It is also the reason why Harbour codebase never uses != (and =, <>, #) operators. They all depend on the SET EXACT setting. See the dozens of commits addressing that throughout the years.

A better behavior would be a compiler warning in -w3 mode.

This is one of those features inherited from ancestors, which would better be deprecated, along with other things like PUBLIC/PRIVATE vars, macros (in strings for sure), &&/* comments and some more.

In the meantime, use x == y and ! x == y
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Compilador Harbour com bug ao fazer comparações!

Mensagem por NiltonGM »

Nunca tinha me ocorrido esse bug em clipper com string, em array não tinha passado por essa situação, só em Harbour é que me deparei com bug.
Procurarei usar sempre == ou !(==) e não vejo problemas deixar no inicio da aplicação setado Set(_SET_EXACT, .t. ) e durante toda aplicação.
Obrigado a todos.
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Compilador Harbour com bug ao fazer comparações!

Mensagem por Jairo Maia »

Olá Pessoal,
NiltonGM escreveu:não vejo problemas deixar no inicio da aplicação setado Set(_SET_EXACT, .t. )
Quanto aos operadores também não vejo problemas, é perfeitamente absorvível. Mas setar Set(_SET_EXACT, .t. ) como global, pode prejudicar outros tipos de pesquisa, como por exemplo a busca de um cliente pelo primeiro nome, e a tabela para no primeiro "Jairo" por exemplo. Se estiver setado comparação exata, somente será encontrado se procurar por "Jairo Maia", e com espaços no final que complete o tamanho do campo, algo como: PadR( "Jairo Maia", nLenCampo ). Mas depende muito da forma que se projeta o aplicativo. No meu caso isso não é possível.

EM TEMPO:
Hoje sabemos que o futuro do Harbour está nas mãos do Viktor, confesso que me preocupa muito ver alguns aspectos na declaração dele:
This is one of those features inherited from ancestors, which would better be deprecated, along with other things like PUBLIC/PRIVATE vars, macros (in strings for sure), &&/* comments and some more.
Difícil saber o que ele está pensando. É difícil também saber como programar sem esses recursos. Sei Lá.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Compilador Harbour com bug ao fazer comparações!

Mensagem por Nascimento »

amigo refiz o seu teste e aqui deu o bug inicialmente mais quando eu separei as "" que estavam juntas ai passou normal

Código: Selecionar todos

proc main()
cAlterou := " " // Vazio estavam juntas "" eu dei um espaço
if "fjsdkfsdfd"  <> " " // Aqui está considerando iguais (estranho pra caramba), retorna .F. (troquei o != para <> mas não funcionou também)
cAlterou := "ALTERADO"
end

? cAlterou // Retorna "" // Extranho
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Compilador Harbour com bug ao fazer comparações!

Mensagem por Itamar M. Lins Jr. »

Ola!
EM TEMPO:
Hoje sabemos que o futuro do Harbour está nas mãos do Viktor, confesso que me preocupa muito ver alguns aspectos na declaração dele:
Permita-me discordar.
Sozinho ele não vai a lugar algum. Ele usa a versão central (3.2) todas as modificações do Przemyslaw Czerpak, Mindaugas Kavaliauskas, Phil Krylov entre outros
estão na versão dele.
Existe a versão principal que ele segue, todos devem seguir a versão principal, pelo menos deveria, mas a versão principal não pode seguir os caprichos de todos.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Compilador Harbour com bug ao fazer comparações!

Mensagem por Nascimento »

Na minha humilde opnião deveriamos dar Graças a Deus por essas pessoas ter criado o harbour e evoluido como vem ate hj
so em eu ver meu sisteminha mesmo modo console rodando em um Windows7,Linux sem esta tendo que fazer gambiarras pra funcionar o que antes era digamos impossivel em clipper ja me dou por satisfeto na verdade satisfeitissimo! e sabendo que o Viktor faz a junçao do harbour original com melhorias melhor ainda
so tenho que dar os parabens a estas pessoas
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Compilador Harbour com bug ao fazer comparações!

Mensagem por JoséQuintas »

Apesar de tudo, não é bug.

O contrário de x = y é x != y
O contrário de x == y é .NOT. x == y

Desde o tempo do dBase, na comparação pode ser considerado o menor dos tamanhos das strings sendo comparadas.
"A" = "AB" pode ser considerado verdadeiro
"" = "QUALQUER COISA" idem
Obs. Não necessariamente nessa ordem.

Aí que entra o SET EXACT ON.

Agora, sobre eliminar macro, PUBLIC e PRIVATE, realmente é complicado.
Mesmo tendo alternativas, praticamente faz parte, principalmente na hora de converter fontes antigos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Compilador Harbour com bug ao fazer comparações!

Mensagem por Itamar M. Lins Jr. »

Agora, sobre eliminar macro, PUBLIC e PRIVATE, realmente é complicado.
Mesmo tendo alternativas, praticamente faz parte, principalmente na hora de converter fontes antigos.
Quanto a isso também não vejo problema.
Fica digamos, da versão 1 até 3.99 usando macros,public,private e da versão 4 já sem essas coisas, se for uma visão global de interesse de todos a eliminação de PUBLIC, PRIVATE, MACROS, ETC.

Mas isso anda bem devagar dará tempo de ajustar nossos códigos, eu mesmo uso e abuso de variáveis private e macros, nem sei como resolveria o problema das macros.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilador Harbour com bug ao fazer comparações!

Mensagem por asimoes »

Até lá espero estar aposentado, hehehe.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder