Interpretar uma estrutura

Programação C em geral

Moderadores: 51, guest2003

Interpretar uma estrutura

Mensagempor vtrx » 31 Mai 2019 14:07

Estou estudando um código em C18 que usa estruturas,mas não entendo muito de estruturas.
Vou postar a estrutura em questão;
Código: Selecionar todos
typedef union _SET_GET_EFFECT_STRUCTURE
{
 struct
 {
  BYTE report_id;
  BYTE effect_type;
  BYTE byte_count; // valid only for custom force data effect.
       // custom force effects are not supported by this device.
 }SET_REPORT_REQUEST;
 struct
 {
  BYTE report_id; // 2
  BYTE effect_block_index; // index dell'effetto
  BYTE block_load_status; // 1 ok, 2 -out of memory, 3 JC was here, or maybe not ? case: undefined.
  int ram_pool_available;
 }PID_BLOCK_LOAD_REPORT;

BYTE val[8];
}SET_GET_EFFECT_STRUCTURE;


Caso não fosse usar esta estrutura,qual seria o meio 'equivalente' de tratar os mesmos dados acima?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Interpretar uma estrutura

Mensagempor eletroinf » 31 Mai 2019 17:44

Eu estou meio destreinado nisso, mas alguma coisa sai:

Aí tu tem uma união com duas estruturas e um vetor dentro.
A union é para alocar o conteúdo no mesmo espaço de memória, ou seja, serve pra que tu possa acesar as variáveis sob diferentes pontos de vista (por exemplo, de algum lugar do código tu vê o conteúdo como um char e de outro como um número).
As structs são uma espécie de variável complexa, isto é, construídas com base em uma coleção de variáveis base do C.
Nesse caso tu acessa as variáveis fazendo, por exemplo no caso de byte_count:

SET_GET_EFFECT_STRUCTURE->PID_BLOCK_LOAD_REPORT->byte_count;

As duas estruturas que estão dentro da union usam o mesmo espaço de memória, cujo tamanho corresponde a estrutura de maior demanda.
Pra usar com variáveis diretas, tem de ver se tu precisa de todas estas variáveis, nesse caso use apenas a estrutura mais completa, que parece ser a segunda. Aquela variável BYTE val[8] compartilha o mesmo espaço de memória das estruturas e é uma forma de acessar esse conteúdo byte a byte.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Interpretar uma estrutura

Mensagempor vtrx » 01 Jun 2019 07:06

Complicadinho hein?
Veja um trecho da rotina que usa a estrutura;
Código: Selecionar todos
switch(set_get_effect_structure.SET_REPORT_REQUEST.effect_type)
{
case 1:// Usage ET Constant Force 0
set_get_effect_structure.PID_BLOCK_LOAD_REPORT.report_id=2; // 2= PID BLOCK LOAD REPORT
set_get_effect_structure.PID_BLOCK_LOAD_REPORT.effect_block_index=1; //
set_get_effect_structure.PID_BLOCK_LOAD_REPORT.block_load_status=1; //
set_get_effect_structure.PID_BLOCK_LOAD_REPORT.ram_pool_available=0xFFFF; //

CONFIGURED_EFFECT_NUMBER[0]=1; //


break;


CONFIGURED_EFFECT_NUMBER[x]é um vetor.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Interpretar uma estrutura

Mensagempor eletroinf » 01 Jun 2019 08:52

Isso aí seria algo como:

Código: Selecionar todos
BYTE effect_type;
BYTE report_id;
BYTE byte_count;
int ram_pool_available;


switch(effect_type)
{
   case 1:
   report_id=2; // 2= PID BLOCK LOAD REPORT
   effect_type = 1; // mesmo que: effect_block_index=1; pois acessa a mesma posição de memória
   byte_count=1; // mesmo que: block_load_status=1; pois acessa a mesma posição de memória
   ram_pool_available=0xFFFF; //

   CONFIGURED_EFFECT_NUMBER[0]=1; //


   break;
}
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Interpretar uma estrutura

Mensagempor vtrx » 01 Jun 2019 11:07

eletroinf escreveu:Isso aí seria algo como:

Código: Selecionar todos
BYTE effect_type;
BYTE report_id;
BYTE byte_count;
int ram_pool_available;


switch(effect_type)
{
   case 1:
   report_id=2; // 2= PID BLOCK LOAD REPORT
   effect_type = 1; // mesmo que: effect_block_index=1; pois acessa a mesma posição de memória
   byte_count=1; // mesmo que: block_load_status=1; pois acessa a mesma posição de memória
   ram_pool_available=0xFFFF; //

   CONFIGURED_EFFECT_NUMBER[0]=1; //


   break;
}


Olhando este exemplo,parece simples.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x