Bug no harbour

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Postei no desenvolvedores do Harbour, mas não obtive nenhum comentário.
A função está fora da macro, mas dá erro se for estática, conforme se escreve.
Aparentemente, a macro está pegando a linha inteira, ao invés de apenas aonde está a macro.

Código: Selecionar todos

Procedure Main

mNumero1 := 1
mNumero2 := 2
cVar := "2"
@ 1, 0 get mNumero1 Valid Test(mNumero1) // aqui ok
@ 2, 0 get mNumero&cVar Valid Test(mNumero&cVar) // aqui erro função indefinida Test()
@ 2, 0 get mNumero&cVar Valid Test(&("mnumero"+cVar)) // aqui ok
Read
Return

Static Function Test(mVar) // se mudar pra "não estática", funciona com todos acima
Return .t.
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Não foi a resposta que eu queria, mas responderam.
Testar no clipper.... como também dá o mesmo erro, então é isso.
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
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Bug no harbour

Mensagem por Pablo César »

Oi José !

Na minha opinião a linha do seu exemplo:

@ 2, 0 get mNumero&cVar Valid Test(mNumero&cVar) // aqui erro função indefinida Test()

Está errada mesmo. Pelo conceito que é para a linguagem C (digamos que seria a base do seu questionamento, por tratar-se de Harbour), diz que o prefixo "&" (Ampersand, em inglês) é um operador unário indicando o endereço na memória do argumento, por exemplo, & x, & func, & a [3]. Então para que dê certo você teria que concatenar adicionando a string em comum para que retorne o nome das variáveis, assim como você fez na linha debaixo:


08 @ 2, 0 get mNumero&cVar Valid Test(&("mnumero"+cVar)) // aqui ok

Na minha opinião não é bug não, tlavez houve má interpretação sua sobre o conceito de macro.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

A única explicação válida é pra manter compatibilidade até em erros.

@ 2, 0 get mNumero&cVar valid .Not. Empty(mNumero&cvar)
Isso funciona.

@ 2, 0 get mNumero&cVar valid Test(mNumero&cVar)
Read
Function Test(cVar)
Return .t.
Isso funciona


@ 2, 0 get mNumero&cVar valid test(mNumero&cVar)
Read
Static Function Test(cVar)
Return .t.
ISTO NÃO FUNCIONA, dá erro de função Test() inexistente.

A diferença é static em test(), que está fora da macro.
Não deveria afetar.

No meu caso passo por referência, @mNumero&cvar, e isso não permite a outra alternativa, somente deixar a função em valid como "não estática".
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
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Bug no harbour

Mensagem por Pablo César »

Entendi a sua colocação, mas não chega a ser um erro grave, sendo que há outra alternativa de utilizar a macro. E no Clipper trabalha da mesma forma, você disse, então dá a entender que não deveria ser usado ou não deveria ser estimulado a usar o macro dessa forma, a o meu entender.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Bug no harbour

Mensagem por Stanis Luksys »

Olá,

Você não pode utilizar uma função estática no valid, porque o get vai rodar em outro local, no programa do getsys, e não vai `enxergar` sua função.

Abraços,

Stanis
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Você não pode utilizar uma função estática no valid, porque o get vai rodar em outro local, no programa do getsys, e não vai `enxergar` sua função.
E como chegou a essa conclusão????

@ 2, 0 Get mNum2 Valid Test(mNum2)
Se isso funciona, prova que a função Test() está visível.

@ 2, 0 Get mNum&cVar Valid .Not. Empty(mNum&cVar)
Se isso funciona, prova que a variável mNum&cVar está visível.

@ 2, 0 Get mNum&cVar Valid Test(&("mNum"+cVar)
Se isso também funciona.... prova que os dois estão visíveis e funcionam juntos.

@ 2, 0 Get mNum&cVar Valid Test(mNum&cVar)
Se isso dá função inexistente.... prova que é bug.
Não entendo porque deixar compatível a nível de bug.

Considerando a mensagem de erro, me parece que Test() passou a fazer parte da macro na hora de executar, mesmo estando fora.
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/
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Bug no harbour

Mensagem por anacatacombs »

Com macro eu tenho exatamente esse mesmo problema seu, mas nunca tratei como erro, e sim uma caracteristica...
Stanis Luksys escreveu:Você não pode utilizar uma função estática no valid, porque o get vai rodar em outro local, no programa do getsys, e não vai `enxergar` sua função.
Certeza Stanis? Acho que o problema é referente a macro e não com o bloco de código de pré ou pós validação.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Mais um teste:


@ 2, 0 Get mNumero@cVar Valid Test()
@ 3, 0 Get mNumero&cVar Valid mNumero&cVar <> -1
Static Function Test()
? mNumero&cVar
Return .t.
Isto funciona, e prova que os dois existem.

@ 2.0 Get mNumero&cVar Valid Test() .And. mNumero&cVar <> -1
Static Function Test()
Return .t.

Isso também dá erro de função Test() inexistente.
Parece que a macro não está se limitando ao seu "bloquinho", mas dependendo de como se escreve.
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
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Bug no harbour

Mensagem por Pablo César »

Stanis Luksys escreveu:não pode utilizar uma função estática no valid, porque o get vai rodar em outro local, no programa do getsys, e não vai `enxergar` sua função
Teoricamente faz sentido o que o colega diz. Não sei se na prática é assim, já que o getsys é considerado uma função interna. Mas parece fazer sentido.

Se bem que o caso do colega, é outro como disse a colega Ana. A questão do José é a macro fundir-se com parte do nome de variável, sem estar tratando como concatenação de substrings e compondo o nome da variável como parâmetro na função de validação.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Realmente, agora não sei exatamente como definir aonde seria o bug.
Só dá erro no get da linha 4, que é a junção dos gets das linhas 1 e 2.
Aceita função static no valid.
Aceita macro no valid.
Nem sempre aceita função static + macro no valid.
No say vai normal.
Talvez quando o macro faz parte no nome da variável, o codeblock pegue a linha inteira pra não deixar nenhuma parte de fora, e o say não usa codeblock, somente o valid.

Código: Selecionar todos

procedure Main

mNumero1 := 1
cVar := "1"
? Test()
? Empty(mNumero&cVar)
? Test() .And. .Not. Empty(mNumero&cVar)
@ 1, 0 Get mNumero&cVar Valid Test()
@ 2, 0 Get mNumero&cVar Valid .Not. Empty(mNumero&cVar)
@ 3, 0 Get mNumero&cVar Valid Test() .And. .Not. Empty(&("mNumero"+cVar))
@ 4, 0 Get mNumero&cVar Valid Test() .And. .Not. Empty(mNumero&cVar)
Read
Static Function Test()
Return .t.
Acho que agora o exemplo ficou claro e completo, demonstra que é a combinação das duas coisas que gera o erro, e que cada uma funciona isoladamente.
Editado pela última vez por Pablo César em 30 Mar 2012 08:17, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Só mais um complemento.... acabo de testar no XHARBOUR e funciona.
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/
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Bug no harbour

Mensagem por Stanis Luksys »

Olá,

Como eu disse anteriormente, o problema não está na macro, mas no fato de ser estática. Se você chama uma função estática no valid, pode funcionar, mas se chama ela com macro, não deveria mesmo funcionar. Em tese, o Eval() não teria como ler um símbolo estático 'compilado em tempo de execução', como se diz dos codeblocks.

Toda macro que envolve nome de função, será executada via Eval(), como bloco de código, não há como fugir disso.

Variáveis (e funções) dentro de blocos de código são tratadas como locais, e só podem vir a ser enxergadas fora do bloco se tiverem sido declaradas como públicas (funções são públicas por padrão).

Quando você executa algo do tipo:
{ |a,b,c| funcao( a, b, c ) }

As variaveis a, b e c não são visíveis dentro do seu programa, pois elas são locais dentro do bloco, como se fossem parâmetros.

Não sei se fui claro, mas o mesmo acontece com funções. O conceito é o mesmo.

De resto, no xHarbour funciona porque eles descaracterizam as funcionalidades originais do Clipper. Exatamente por isso chegou-se a um beco sem saída.

Leia isso (wikipedia):
http://pt.wikipedia.org/wiki/Harbour
xHarbour é uma bifurcação[6] no desenvolvimento do Harbour. xHarbour sempre tomou uma posição mais agressiva na adoação de novas tecnologias, enquanto o Harbour preferiu se concentrar na compatibilidade com o Clipper em um primeiro momento para depois implementar novas funcionalidades. Harbour também se concentrou em suportar uma grande variedade de sistemas operacionais enquanto o xHarbour suporta basicamente o MS Windows e o Linux 32-bit.

Os desenvolvedores do Harbour tentam documentar todos os comportamentos que não são oficialmente documentos pelo Clipper e testar todo código compatível com Clipper para compilar com o Harbour mantendo sua compatibilidade total, incluindo os bugs não críticos do Clipper.

Os desenvolvedores do Harbour rejeitam mudanças que quebram a compatibilidade com o Clipper, embora essas rejeições estão sendo revistas agora que o Harbour tem uma arquitetura muito bem implementada e permite extensões à linguagem sem alterar o núcleo do compilador.

Em 2010 Harbour teve um ganho considerável na sua adoação após o lançamento da versão 2.0 que provou ser muito estável, poderosa, flexível e moderna, enquanto o xHarbour tem sido negligênciado pelos seus desenvolvedores e vem perdendo apoio por parte dos seus usuários, como pode ser verificadas em suas listas [7] [8] [9].

Recentemente um texto chamado xhb-diff.txt[10] disponível na distribuição do Harbour demonstra as inúmeras deficiências do xHarbour em termos de arquitetura que praticamente impossibilitarão a adoção de forma consistente de futuras modernizações na linguagem sem causar mais compromissos do que já carrega.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no harbour

Mensagem por JoséQuintas »

Ainda bem que o pessoal do Harbour não seguiu seu texto.
Compile e confirme que funciona função local e macro, e apenas a sintaxe que mencionei é que não funciona, assim como no Clipper.
Seria péssimo se fosse mesmo como mencionou no seu texto.
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Bug no harbour

Mensagem por asimoes »

José,

Isso acontece no fonte tgetlist.prg, na classe HBGetList

lValid := Eval( oGet:postBlock, oGet, aMsg ) // linha 622


Fiz uns testes aqui por favor tirem as concluões:

Código: Selecionar todos

bBlock := {|| Test() }

@ 1, 0 Get mNumero&cVar Valid Test()
@ 2, 0 Get mNumero&cVar Valid .Not. Empty(mNumero&cVar)
@ 3, 0 Get mNumero&cVar Valid Test() .And. .Not. Empty(&("mNumero"+cVar))
@ 4, 0 Get mNumero&cVar Valid Eval(bBlock) .And. .Not. Empty(mNumero&cVar)
Read

STATIC Function Test()
   @24,00 say "teste "+time()
Return .t.
►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