Página 1 de 1

Interpretar uma estrutura

MensagemEnviado: 31 Mai 2019 14:07
por vtrx
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?

Re: Interpretar uma estrutura

MensagemEnviado: 31 Mai 2019 17:44
por eletroinf
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.

Re: Interpretar uma estrutura

MensagemEnviado: 01 Jun 2019 07:06
por vtrx
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.

Re: Interpretar uma estrutura

MensagemEnviado: 01 Jun 2019 08:52
por eletroinf
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;
}

Re: Interpretar uma estrutura

MensagemEnviado: 01 Jun 2019 11:07
por vtrx
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.