Página 1 de 1
Bug no harbour
Enviado: 26 Mar 2012 12:43
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.
Bug no harbour
Enviado: 26 Mar 2012 14:10
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.
Bug no harbour
Enviado: 26 Mar 2012 15:59
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.
Bug no harbour
Enviado: 26 Mar 2012 16:31
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".
Bug no harbour
Enviado: 26 Mar 2012 16:39
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.
Bug no harbour
Enviado: 27 Mar 2012 11:53
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
Bug no harbour
Enviado: 27 Mar 2012 14:08
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.
Bug no harbour
Enviado: 27 Mar 2012 14:15
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.
Bug no harbour
Enviado: 27 Mar 2012 14:33
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.
Bug no harbour
Enviado: 27 Mar 2012 15:03
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.
Bug no harbour
Enviado: 30 Mar 2012 05:23
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.
Bug no harbour
Enviado: 30 Mar 2012 14:29
por JoséQuintas
Só mais um complemento.... acabo de testar no XHARBOUR e funciona.
Bug no harbour
Enviado: 28 Abr 2012 14:53
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.
Bug no harbour
Enviado: 28 Abr 2012 19:42
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.
Bug no harbour
Enviado: 30 Abr 2012 11:13
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.