Ir ao conteúdo

como uma variavel int receber o valor de uma variavel struct


foxlove

Posts recomendados

Postado

Olá pessoal, gostaria de fazer isso em C:

struct RXB0CTRL b_rxb0ctrl;

int a;

a = b_rxb0ctrl;

A ideia é a seguinte, fiz uma struct, utilizei o campo de bits dele e coloquei 16 variaveis de 1 bit cada, no total 16 bits. Eu seto cada bits dentro da struct, configuro tudo, ai depois preciso preciso enviar os bits pela serial, mais não consigo fazer isso pela struct, então queria pegar o valor total da struct e fazer um inteiro receber e sim conseguiria fazer isso. Peço ajuda urgente.

Postado

Só fazer a = b_rxb0ctrl; não funciona, já que um é uma struct e outro é um int, isso é um erro, se você quer fazer com que sua estrutura seja vista como um inteiro você tem que criar uma função que transforme a sua estrutura em um inteiro e depois traduza seu inteiro de volta para uma struct.

Postado

Eu acho que uniões se encaixam bem no seu caso.

Você pode fazer assim:


union TEST
{
struct RXB0CTRL b_rxb0ctrl;
int a;
} b;

A característica principal das uniões é que todos os elementos dentro dele compartilham uma mesma área da memória. Ou seja, se você muda o valor da váriavel da estrutura, automaticamente você muda o valor da váriavel inteira, e vice-versa, já que ambas compartilham o mesmo endereço de memória.

Sendo assim, você pode setar todos os bits da estrutura usando a variável da estrutura e depois usar o valor resultante desses bits setados usando a variável inteira.

Só não se esqueça que você terá que colocar mais uma indireção no uso da variável da união:


b.b_rxb0ctrl.bit1= 0;
b.b_rxb0ctrl.bit2= 1;
b.b_rxb0ctrl.bit3= 0;
b.b_rxb0ctrl.bit4= 1;
printf ("%d", b.a);

Tome cuidado com uma coisa que eu acabei de perceber. Normalmente a gente interpreta o número 10 em binário assim:

bit 4= 1, bit 3= 0, bit 2= 1, bit 1= 0

Ou seja, 10 (10)= 1010 (2)

Mas quando você for setar os bits pra formar o valor 10 decimal, você terá que fazer inversamente:

bit 4= 0, bit 3= 1, bit 2= 0, bit 1= 1

Postado

Eu realmente não recomendo fazer uma union, em unions o alinhamento dos bits é feito pela implementação e não dá pra garantir o que resulta ao colocar uma struct e tentar ler um int ou vice versa.

O mais correto mesmo seria criar uma função que lê cada variável da struct e monta um inteiro assumindo que cada um dos primeiros 16 bits desse inteiro é uma flag. Aliás acho que seria mais prático ainda usar um short no lugar da struct e obter cada bit significativo fazendo máscaras de bit com '&'.

Postado

Eu conheço um outro jeito que pode ser ainda melhor.

Eu faria assim:


struct TEST
{
int a: 1;
int b: 1;
int c: 1;
int d: 1;
int e: 1;
int f: 1;
int g: 1;
int h: 1;
operator char ()
{
return a<< 7 | b<< 6 | c<< 5 | d<< 4 | c<< 3 | b<< 2 | a;
}
};

TEST x;
char y;

x.a= 1;
x.b= 0;
x.c= 1;
x.d= 0;
x.e= 0;
x.f= 0;
x.g= 0;
x.h= 0;

y= (char) x;

Eu usei esse código só pra exemplificar, pois no caso do colega, ele quer usar uma estrutura com 32 bit fields pra depois passar esses bits setados pra uma variável 'int', mas no meu exemplo eu tô usando só 8 bit fields pra passar o valor pra um 'char' pra ficar mais simples de demonstrar.

Aqui eu uso a sobrecarga do operador 'char', que é definida dentro da estrutura, e essa sobrecarga é usada pra fazer o cast da variável do tipo 'TEST' pra uma variável do tipo 'char'. Com a sobrecarga, o valor é facilmente convertido de um tipo pro outro com um simples cast. Sem a sobrecarga, o compilador reclamaria dizendo que não é possível fazer uma conversão de uma variável do tipo 'TEST' pra um variável do tipo 'char'.

No caso do colega, a única diferença será a quantidade de bit fields e a sobrecarga de operador, que no caso será um 'int', em vez do 'char' que eu usei no exemplo. O cast deve usar um 'int' também, logicamente.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!