Ir ao conteúdo
  • Cadastre-se
José Maria F Silva

C Problemas Com struct Extruturas em C

Recommended Posts

Bom dia Amigos

Eu programo em c para micro-controladores e estou com uma duvida num programa criado pelo compilador, gostaria de saber se algum dos amigos poderia me ajudar?

 

eu não consegui entender bem esta estrutura e como manipula-la, na verdade eu uso muito pouco estruturas devido realmente sempre duvidas com elas,

como manipula-las etc.

Eu coloquei abaixo os comentários, gostaria de saber se esta correto, mas as duvidas são somente onde estão os

meu comentários, no restante ok.

Onde esta *rxTail na struct eu entendo que é um ponteiro para a variável uint8_t, porém no programa ele incrementa o rxtail  mas eu entendo que o rxTail

é apenas um endereço ai onde esta minha duvida, não teria que ser um buffer.??

 

typedef struct
{
    /* RX Byte Q */
    uint8_t                                      *rxTail ;  //aqui foi criado um ponteiro para apenas uma variável tipo inteira ??

    uint8_t                                      *rxHead ;

    /* TX Byte Q */
    uint8_t                                      *txTail ;

    uint8_t                                      *txHead ;

    UART_BYTEQ_STATUS                        rxStatus ;

    UART_BYTEQ_STATUS                        txStatus ;

} UART_OBJECT ;

static UART_OBJECT uart2_obj ;

 

 

 

void interrupt(void)

{

    while((U2STAbits.URXDA == 1)) 
    {
        *uart2_obj.rxTail = U2RXREG;  // salva no end. da extruct apontado pelo ponteiro rxtail  o dado presente em u2rxreg
       
        uart2_obj.rxTail++;      //aqui não entendi,pois se eu tenho somente um endereço da struct não teria que ser um buffer

 

        if(uart2_obj.rxTail == (uart2_rxByteQ + UART2_CONFIG_RX_BYTEQ_LENGTH))
        {
            uart2_obj.rxTail = uart2_rxByteQ;
        }

        uart2_obj.rxStatus.s.empty = false;
        

        
        if(uart2_obj.rxTail == uart2_obj.rxHead)
        {
            //Sets the flag RX full
 
            uart2_obj.rxStatus.s.full = true;
            break;
            
        }
    }

}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo bem.

 

Ponteiro recém declarado não aponta, é selvagem.

 

1 hora atrás, José Maria F Silva disse:

*uart2_obj.rxTail = U2RXREG;  // salva no end. da extruct apontado pelo ponteiro rxtail  o dado presente em u2rxreg

Essa atribuição está errada, pois, a partir do ponto que se declara um ponteiro; não se pode desreferência-lo (*uart2_obj.rxTail = ...) até que se tenha atribuído um local (um referência) para ele. Nesse caso não foi atribuído local, porém se vê uma desreferência (*) e uma atribuição. Entretanto se U2RXREG é uma referência o erro está no desreferenciamento do comando.

 

 

1 hora atrás, José Maria F Silva disse:

uart2_obj.rxTail++;      //aqui não entendi,pois se eu tenho somente um endereço da struct não teria que ser um buffer

Isso mesmo, teria que xTail antes tido uma atribuição vetorial de dados, para só assim, apontar para um lugar, disso surge o paradoxo. Na maioria dos códigos os profissionais documentam. Sem essa gentileza, certos códigos são difíceis em sentido.

 

Conclusão, está errado; não porque não tenha entendido, mais sim porque justamente entendeu nos termos certos que o código é quem está errado.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×