PsySc0rpi0n 18 Posted March 28, 2019 Report Share Posted March 28, 2019 (edited) 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 March 28, 2019 by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to post Share on other sites
Rui Carlos 359 Posted March 29, 2019 Report Share Posted March 29, 2019 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; Rui Carlos Gonçalves Link to post Share on other sites
PsySc0rpi0n 18 Posted March 30, 2019 Author Report Share Posted March 30, 2019 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 Link to post Share on other sites
HappyHippyHippo 1,162 Posted March 31, 2019 Report Share Posted March 31, 2019 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 Portugol Plus Link to post Share on other sites
PsySc0rpi0n 18 Posted March 31, 2019 Author Report Share Posted March 31, 2019 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 Link to post Share on other sites
HappyHippyHippo 1,162 Posted April 2, 2019 Report Share Posted April 2, 2019 Para as combinações das variáveis a serem consideradas IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
PsySc0rpi0n 18 Posted April 3, 2019 Author Report Share Posted April 3, 2019 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 Link to post Share on other sites
HappyHippyHippo 1,162 Posted April 3, 2019 Report Share Posted April 3, 2019 se é para determinar a condição do if, então interessa sempre a tabela de verdade IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
PsySc0rpi0n 18 Posted April 3, 2019 Author Report Share Posted April 3, 2019 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 Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now