Como resolver erro: Meaningless use of expression: 'logical'
Moderador: Moderadores
- rochinha
- 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'
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
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Como resolver erro: Meaningless use of expression: 'logical'
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
xHarbour.org + Hwgui + PostgreSql
- rochinha
- 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'
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
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() )
...
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() )
...
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Como resolver erro: Meaningless use of expression: 'logical'
Entendi, ok, enche mesmo..
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
Re: Como resolver erro: Meaningless use of expression: 'logical'
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!
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

- 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'
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.
Fiquei curioso mas não tenho este ambiente instalado ([x]Harbour).
Se puser, teste isto:
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() )
...
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.rochinha escreveu:no exemplo acima estou passando um parametro lógico de retorno e um codeblock.
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)
Alexandre Santos (AlxSts)
Re: Como resolver erro: Meaningless use of expression: 'logical'
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.
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!
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!
- rochinha
- 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'
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:
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.
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.
...
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Re: Como resolver erro: Meaningless use of expression: 'logical'
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.
Código: Selecionar todos
iif( nUsuarioNivel < 3, .t., MostraAlgo() )Código: Selecionar todos
if !nUsuarioNivel < 3
MostraAlgo()
endOu 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!
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!
