Jump to content
PsySc0rpi0n

Usar o operador ternário

Recommended Posts

PsySc0rpi0n

Boas.

Já não me recordo como se usar o operador ternário quando preciso de devolver o resultado de uma operação dentro do operador ternário.

Passo a expôr o problema:

Tenho uma função que é suposto devolver 0 ou 1 mas a condição a verificar é diferente, ou seja, devolve 0 se a condição XXX for verdadeira e devolve 1 se a condição YYY for verdadeira.

Com um 'if era fácil mas para o compilador, existe sempre a possibilidade de uma terceira situação não contemplada no 'if' e portanto o compilador queixa-se que a função precisa de devolver um valor.

Passo ao código

uint8_t TWI_Read(uint8_t d_address, uint8_t* packet){
    // Send Slave address and R/W operation
    TWI0_MADDR = 0x18 | READ_OP; //0x18 + 1 bit for read operation
    
    // Check for Slave ACK/NACK bit for slave address
    if( !(TWI0_MSTATUS & TWI_RXACK_bm) ){
        // Read data
        *packet = TWI0_MDATA;
    }
    
    if(TWI0_MSTATUS & TWI_RIF_bm)
        return 0x00;
    else if (TWI0_MSTATUS & TWI_WIF_bm)
        return 0x01; 
}

 

Como declarei esta função para devolver um unit8_t e o if que está no final verifica duas condições diferentes, para o compilador existe sempre a possibilidade de nem a condição do IF nem a condição do ELSE IF serem verdadeiras, o compilador queixa-se.

Portanto queria usar o operador ternário porque me resolveria o problema mas já não me recordo de como o usar nesta situação.

Assim dá:

return (TWI0_MSTATUS & TWI_RIF_bm) ? 0x00 : ((TWI0_MSTATUS & TWI_WIF_bm) ? 0x01 : 0x02);

Ou seja, se (TWI0_MSTATUS & TWI_RIF_bm) der 1, devolve0, se for 0, vai ver o resultado de (TWI0_MSTATUS & TWI_WIF_bm). Se este for 1, devolve 1, se for falso devolve 2. Mas não sei se era assim ou se há outra forma mais comum para fazer isto!

Eu sei que podia adicionar o ELSE no if e devolver o 0x02, mas na verdade este 0x02 nem me interessa! Apenas me interessa o resultado daquelas duas verificações porque sei que no que pretendo, apenas aqueles dois resultados são possíveis!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
Rui Carlos

Se apenas aquelas duas situações podem ocorrer, podes remover a segunda condição, e deixar apenas o else.

if(TWI0_MSTATUS & TWI_RIF_bm)
        return 0x00;
else
        return 0x01; 

Ou então:

return (TWI0_MSTATUS & TWI_RIF_bm) ? 0x00 : 0x01;

 

Share this post


Link to post
Share on other sites
PsySc0rpi0n
14 hours ago, Rui Carlos said:

Se apenas aquelas duas situações podem ocorrer, podes remover a segunda condição, e deixar apenas o else.


if(TWI0_MSTATUS & TWI_RIF_bm)
        return 0x00;
else
        return 0x01; 

Ou então:


return (TWI0_MSTATUS & TWI_RIF_bm) ? 0x00 : 0x01;

 

Eu acho que usando assim vai haver uma situação ambígua, mas pode ser que seja confusão minha.

Tenho que testar.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

vamos por partes.

consegues desenhar aqui a tabela de verdade do resultado em função dos dois parâmetros ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n
2 hours ago, HappyHippyHippo said:

vamos por partes.

consegues desenhar aqui a tabela de verdade do resultado em função dos dois parâmetros ?

Estás a falar de uma tabela de verdade para que operador? AND, OR? Não percebi a pergunta!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

Para as combinações das variáveis a serem consideradas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n

A variável TWI0_MSTATUS contém dois bits que são de interesse e que estão a ser comparados com duas macros, TWI_RIF_bm e TWI_WIF_bm.

A macro TWI_RIF_bm é substituída pelo valor de  0x80 e a macro TWI_WIF_bm é substituída por 0x40... Portanto o interesse é encontrar um 1 no MSB daquele registo TWI0_STATUS ou um 1 no bit de valor 4 do mesmo registo. Ou caso não encontre nenhum também tenho que considerar essa hipótese. A ambiguidade aqui é que o resultado da comparação do registo TWI0_STATUS com 0x80 e com 0x40 é 1 ou 0, Ou seja, preciso de diferenciar o 1 da comparação com 0x80 do 1 da comparação com 0x40. O 0 das duas comparações é indiferente porque não me interessa diferenciar! Portanto aqui neste caso, não sei se interessa sequer aplicar uma tabela de verdade.

 

PS: Eu tinha dito que os bits de interesse no registo TWI0_STATUS eram os dois LSB, mas enganei-me.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

se é para determinar a condição do if, então interessa sempre a tabela de verdade


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n
2 minutes ago, HappyHippyHippo said:

se é para determinar a condição do if, então interessa sempre a tabela de verdade

 

Bom, eu já estou a pensar nisto de outra forma e se calhar nem faz muito sentido como eu estava a tentar fazer.

Vou separar isto em duas funções porque eu já estava a misturar uma operação de leitura com uma operação de escrita e por isso estava-se a tornar mais complicado, até para explicar o que eu estava a tentar fazer. Deixa-me pensar mais um pouco nisto e no resto dos settings que tenho que ter em conta e depois se precisar, cá voltarei!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.