Página 1 de 1
macro.

Enviado:
05 Dez 2008 09:29
por ffcprog
Bom dia amigos.
Estou com uma duvida, em uma adaptação de código, se possivel gostaria que alguém me ajudasse ou pelo menos sanasse a duvida se tem ou não a possibilidade.
Imaginem um array de 64 bytes.
buffwork[64].
Este buffer é utilizado em uma função que envia os dados..
Agora.
Imaginem uma estrutura que ocupa 56 bytes, onde existem varias informações. ok.!!
Estou fazendo o seguinte, para enviar os dados.
Aponto o endereço da estrutura para um ponteiro.
aponto o endereço do buffer para outro ponteiro.
I = 56;
while ( I) {
*Destino++ = *Fonte++;
I--;
}
minha dúvida agóra!
Existe alguma forma do compilador criar o buffer no endereço absoluto que eu informei, e eu criar uma estrutura que é um espelho para aquele endereço?
quando por exemplo eu disser que.
estrutura.adc1 = adc_read(1);
O compilador ja vai estar ciente que o resultado do adc vai para bytes
1 e 2 do endereço absoluto de uma variavel que eu criei.
Espero ter me expressado bem.
ffcprog

Enviado:
05 Dez 2008 09:48
por joao
Ola ffcprog,
Infelizmente não entendi tudo, mas vou tentar dar um exemplo:
- Código: Selecionar todos
char teste[100] = "OI mae! To na TV BOBO!!!";
char *pteste = teste;
printf("A variavel TESTE tem: %s\n", teste);
printf("A variavel PTESTE tem: %s\n", pteste);
o resultado será:
A variavel TESTE tem: OI mae! To na TV BOBO!!!
A variavel TESTE tem: OI mae! To na TV BOBO!!!
Viu que ambos estão com o mesmo dado?
Será que é isso que vc queria fazer? Senão, vou te pedir para tentar explicar melhor.
PS: Vc falou de buf em alguns momentos, mas nao chegou a usar essa variavel, dando outros nomes, quem sabe por isso fiquei meio perdido.
[]'s

Enviado:
05 Dez 2008 12:34
por Sergio38br
Boa tarde, ja usou union??
em C18
- Código: Selecionar todos
struct
{
unsigned b0:1;//
unsigned b1:1;//
unsigned b2:1;//
unsigned b3:1;//
unsigned b4:1;//
unsigned b5:1;//
unsigned b6:1;//
unsigned b7:1;//
}cntrl2;
union
{
struct
{
unsigned cntrl2;
};
}cntrl2a;
cntrl2.b0 = 1 //cntrl2 = 0x01
cntrl2a.cntrl2 // agora tbem eh 0x01
{ ]'s
Sergio

Enviado:
05 Dez 2008 13:59
por ffcprog
nossa sergio, me deu um nó no cerebro agora...
Me explique o que é isto?!
não consegui visualizar o que este comando faz..
ffcprog

Enviado:
05 Dez 2008 14:07
por Sergio38br
temos dois nome de variaveis, primeiro cntrl2 que é um tipo bitfield, com o segundo cntrl2a criei uma associação com o primeiro, na verdade vc pode criar esta associação com diversas variaveis ex. poderia ter um cntrl1, cntrl3 cada uma seria acessada usando o cntrl2a.(variavel incluida na declaração do union).
[ ]'s
Sergio

Enviado:
06 Dez 2008 00:49
por msamsoniuk
talvez uma forma mais clara do que o sergio citou seja assim:
- Código: Selecionar todos
struct message // apenas define como eh a struct
{
int adc[8];
int channel[8];
};
union // junta a struct e um buffer no mesmo espaco comum
{
struct message body;
char buffer[32];
} msg;
msg.body.adc[0] = adc[0]; // int 16 bits, ocupa o 1.o par de bytes
msg.body.adc[1] = adc[1]; // int 16 bits, ocupa o 2.o par de bytes
...
for(i=0;i!=32;i++)
{
send_spi_byte(msg.buffer[i]); // encherga a struct como um buffer de bytes
}

Enviado:
09 Dez 2008 10:17
por ffcprog
nossa tentei fazer de varias formas diferentes, mais o processo fica lento e grande. acho que utilizando o union vai ficar melhor.
Seguinte, só como exemplo.!!
char buffer_control[32]
os bytes 10 e 11 do buffer_control formão uma word.
os bytes 12 e 13 e 14, são bits de controle. cada bit e 4 bits tem seus nomes.
como ficaria o union para anexar estes dois nomes aqui.
ADC
control
para ====
ADC = bytes 10 e 11 do buffer_control.
control = bytes 12 , 13 , 14 do buffer control.
ffcprog

Enviado:
09 Dez 2008 10:26
por Sergio38br
Bom dia
Perguntas:
e o resto da informação??
em relação aos bytes de controle, ele funcionaram apenas como bool ou terão outras informações??
Vc pode mapear todos os bytes destas array?
[ ]'s
Sergio

Enviado:
09 Dez 2008 15:37
por Sergio38br
pergunta besta de minha parte, me desculpe, não sei como esta estruturado teu programa, vc quer que os valores das variaveis sejam, espelhados????
[ ]'s
Sergio

Enviado:
09 Dez 2008 15:49
por ffcprog
isso.. achou a palavra que eu não estava encontrando.
Só que da array de 32 bytes por exemplo.
Apenas alguns bytes serão espelhados com outros nomes..
esta array de 32 bytes carrega varias informações no sentido PIC >>> PC.
bits de informações
Word´s do ADC de leitura do pic
Etc.
Como exemplo
só para você entender melhor.
char Dados_PIC_PC[10];
Byte 1,2 = 1 word
Byte 3,4,5,6 = 1 longint;
byte 7,8 = 8 bits de controle e 2 nibles para dado bcd
byte 9,10 = 1 palavra de 12 bits para msb destes 16 bits, e 1 nible no lsb que informa valores de 0 a 15;
Melhor entendido assim ?
ffcprog

Enviado:
09 Dez 2008 16:07
por Sergio38br
olha para fazer espelhamento tem de copiar mesmo, consigo dizer que um mesmo endereço de variavel tenha dois nomes, mas para espelhar dados:
dado1 = 0x33 e automaticamente espelho_dado1 = 0x33, só copiando os dados
Pensei que vc quizesse acessar os dados com outros nomes...
[]'s
Sergio

Enviado:
10 Dez 2008 06:56
por ffcprog
ixi compliquei novamente né?
Nossa e complicado explicar, ainda mais com o "C", estou engatinhando ainda com esta linguagem.
Bom deixa pra lá, não quero ocupar mais espaço sem chegar em algum lugar.
Pessoal muito obrigado pela ajuda de todos.
ffcprog