Página 1 de 1

macro.

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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
}

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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