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:

Código: Selecionar todos

...
iif( criticaX, .t., funcaoY() )
...
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:

Código: Selecionar todos

...
iif( criticaX, fun(), funcaoY() )
...
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.

Código: Selecionar todos

    ...
    iif( criticaX, .t., funcaoY() )
    ...
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:

Código: Selecionar todos

iif( nUsuarioNivel < 3, .t., MostraAlgo() )
então seu uso não se justifica, já que poderia ser utilizado um simples comando IF:

Código: Selecionar todos

if  !nUsuarioNivel < 3
   MostraAlgo()
end
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.