Como resolver erro: Meaningless use of expression: 'logical'

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

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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 ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem por sygecom »

Entendi, ok, enche mesmo..
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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" )
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como resolver erro: Meaningless use of expression: 'logical'

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder