Página 1 de 1
Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 27 Mar 2010 06:16
por rochinha
Amiguinhos,
Este tipo de warning não me causa problemas mas enche o saco toda vez que aparece.
Como resolver erro: Meaningless use of expression: 'logical'
Geralmente ocorre nas linhas que tenho iif( ..., ..., ... ).
Estou usando somente harbour arquivo /m /n /o /w0
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 04 Abr 2010 23:51
por sygecom
Já peguei esses avisos, mas nunca dei bola, por que nunca me deu problema no aplicativo, mas isso ai serve apenas para ocultar o aviso certo ?
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 05 Abr 2010 12:02
por rochinha
Amiguinho,
Realmente não da problema, mas enche o saco, pois usando uma versão do Harbour para compilar isto passa e quando usa outra já mostra este erro.
Não tive tempo de analisar os .CH envolvidos de cada versão para ver as diferenças. Não me lembro mas IIF() não é função e sim um xCommand e portanto receptível para tais erros.
Verifiquei também que em alguns de meus IIF() uso o seguinte:
Usando minha versão .45 não ocorre nenhum destes alarmes, mas usando a 1.1.1 ocorrem.
Conclusão:
Se o IIF() não receber dois parâmetros de mesmo tipo ocorre este tipo de mensagem, ou seja, no exemplo acima estou passando um parametro lógico de retorno e um codeblock.
Se os dois parâmetros não forem ou lógicos ou codeblocks obtenho a mensagem.
O que fiz para testar, criei uma função
dummy, fun(), que me retorna sempre verdadeiro:
Dependendo do resultado de
criticaX, executo o parâmetro 1 ou 2.
To me virando, mas...
enche o saco do pobre
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 05 Abr 2010 12:29
por sygecom
Entendi, ok, enche mesmo..
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 05 Abr 2010 12:35
por Maligno
Se essa mensagem for do BCC (ou outro compilador que seja) e for possível interagir com esse compilador também, pode-se desligar esse warning especificamente, ao invés de desligar todos os warnings (imagino que /W0 faça isso). Até porque, alguns warnings são importantes. Desligando-se tudo perde-se o recurso, por conta de algo que parece ser bug.
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 05 Abr 2010 14:53
por alxsts
Olá!
Concordo com o Maligno: a exibição de
warnings é importante. Em Clipper, sempre usei
switch /W.
Certamente o compilador está alertando que se o resultado da avaliação da expressão fornecida (neste caso CriticaX), em tempo de execução, não resultar em um valor verdadeiro ou falso, você terá problemas.
rochinha escreveu:no exemplo acima estou passando um parametro lógico de retorno e um codeblock.
Não creio que tenha algo a ver com
code blocks pois, no exemplo, você está passando uma função e não um
code block.
Fiquei curioso mas não tenho este ambiente instalado ([x]Harbour).
Se puser, teste isto:
Código: Selecionar todos
iif( criticaX == .T., fun(), funcaoY() )
//
? Iif( Val( Right( Time() ) ) % 2 == 0, "Par", "Ìmpar" )
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 05 Abr 2010 17:59
por Maligno
No Clipper as funções de teste IF() e IIF() se equivalem. E em ambas o retorno pode ser de qualquer tipo. Inclusive, as expressões 2 e 3 podem retornar tipos diferentes. Se o [x]Harbour tem o compromisso da retrocompatibilidade, essa regra deve ser mantida. Assim, qualquer warning nesse sentido, a meu ver, deve ser encarado como bug, pura e simplesmente.
A título de curiosidade, o par ternário de C++, equivalente ao IF() do Clipper, só admite que as expressões 2 e 3 sejam do mesmo tipo. Aí sim, um warning faz todo sentido.
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 07 Abr 2010 11:31
por rochinha
Amiguinhos,
Concordo com todos, inclusive com a colocação do Maligno referente a critica necessitar de retornos equivalentes.
Eu já uso o parâmetro warning /W0 mas o mesmo não desligou no Harbour.
Quanto ao retorno nos IIF()/IF() a função colocada no terceiro parâmetro sempre irá retornar .T., mas é necessário pois o IIF() está verificando uma situação, que se verdadeira apenas retorna .T. e se falsa executa uma rotina e retorna .T. sempre.
Tipo:
Código: Selecionar todos
...
iif( nUsuarioNivel < 3, .t., MostraAlgo() )
...
Function MostraAlgo()
...
return .t.
...
Como eu nunca usei o IIF() para criticar e retornar tipos diferentes então não me preocupo com estes warnings, mas se uma versão antiga não apresenta, numa versão intermediária apresenta e numa versão mais nova não apresenta, ai fica chato.
Mas fica o alerta.
Re: Como resolver erro: Meaningless use of expression: 'logical'
Enviado: 07 Abr 2010 11:51
por Maligno
Pra mim é uma regra: se o segundo ou terceiro argumento de um IF/IIF for um valor lógico constante, como no seu exemplo:
então seu uso não se justifica, já que poderia ser utilizado um simples comando IF:
mesmo que esse IIF() faça parte de um comando IF (saída de um como entrada de outro).
Ou seja, usando a lógica a seu favor, fatorando o código e tornado-o mais legível.