Compilador Harbour com bug ao fazer comparações!
Moderador: Moderadores
Compilador Harbour com bug ao fazer comparações!
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
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
nilton@sistrom.com.br
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Compilador Harbour com bug ao fazer comparações!
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:
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 1Abraç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)
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)
- Itamar M. Lins Jr.
- 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!
Ola!
Saudações,
Itamar M. Lins Jr.
! 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
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Compilador Harbour com bug ao fazer comparações!
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.
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)
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)
- Itamar M. Lins Jr.
- 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!
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:
Itamar M. Lins Jr.
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:
Saudações,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
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
Compilador Harbour com bug ao fazer comparações!
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.
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
nilton@sistrom.com.br
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Compilador Harbour com bug ao fazer comparações!
Olá Pessoal,
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:
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.NiltonGM escreveu:não vejo problemas deixar no inicio da aplicação setado Set(_SET_EXACT, .t. )
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:
Difícil saber o que ele está pensando. É difícil também saber como programar sem esses recursos. Sei Lá.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.
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)
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)
- Nascimento
- 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!
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 "" // ExtranhoA arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- Itamar M. Lins Jr.
- 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!
Ola!
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.
Permita-me discordar.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:
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.
Itamar M. Lins Jr.
- Nascimento
- 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!
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
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Compilador Harbour com bug ao fazer comparações!
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.
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/
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/
- Itamar M. Lins Jr.
- 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!
Quanto a isso também não vejo problema.Agora, sobre eliminar macro, PUBLIC e PRIVATE, realmente é complicado.
Mesmo tendo alternativas, praticamente faz parte, principalmente na hora de converter fontes antigos.
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.
Itamar M. Lins Jr.
Compilador Harbour com bug ao fazer comparações!
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)
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)

