Como descobrir tamanho de um vetor em uma struct encadeada?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como descobrir tamanho de um vetor em uma struct encadeada?

Mensagempor ivan braga » 17 Mar 2012 08:39

Tem hora que dá um branco danado.
Vou explicar, já tentei de varias formas descobrir o tamanho de um vetor de bytes onde é guardada informações sobre um caractere que vou exibir no glcd.
Os arquivos são gerados usando este programa http://code.google.com/p/lcd-image-converter/.
Para facilitar o entendimento, segue um pequeno arquivo gerado pelo programa.

Código: Selecionar todos
// filename:
// name: FontX
// family: MS Shell Dlg 2
// size: 14
// style: Bold
// included characters: 012
// antialiasing: <value not defined>
// type: proportional
// encoding: UTF-8
//

typedef struct {
    const  unsigned char *font;
    const  int width;
    const  int height;
    } tImage;
typedef struct {
    const long int code;
    const tImage *image;
    } tChar;
typedef struct {
    const int length;
    const tChar *chars;
    } tFont;


const unsigned char image_data_FontX_0x30[50] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xf0, 0x78,
0xe0, 0x38,
0xc0, 0x18,
0xc2, 0x18,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0xc2, 0x18,
0xc0, 0x18,
0xe0, 0x38,
0xf0, 0x78,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
};
const tImage FontX_0x30 = { &image_data_FontX_0x30[0], 13, 25};


const unsigned char image_data_FontX_0x31[50] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xf8, 0x78,
0xf8, 0x78,
0xc0, 0x78,
0xc0, 0x78,
0xc0, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xc0, 0x08,
0xc0, 0x08,
0xc0, 0x08,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
};
const tImage FontX_0x31 = { &image_data_FontX_0x31[0], 13, 25};


const unsigned char image_data_FontX_0x32[50] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xe0, 0x78,
0xc0, 0x18,
0xc0, 0x08,
0xde, 0x08,
0xff, 0x08,
0xff, 0x08,
0xff, 0x08,
0xfe, 0x18,
0xfe, 0x18,
0xfc, 0x38,
0xf8, 0x78,
0xf0, 0xf8,
0xe1, 0xf8,
0xc0, 0x00,
0xc0, 0x00,
0xc0, 0x00,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
};
const tImage FontX_0x32 = { &image_data_FontX_0x32[0], 13, 25};


const tChar FontX_array[] = {

// character: '0'
  {0x30, &FontX_0x30},
// character: '1'
  {0x31, &FontX_0x31},
// character: '2'
  {0x32, &FontX_0x32}
};

const tFont FontX = { 3, &FontX_array[0] };


Para acesso aos bytes do vetor faço por exemplo (Font6.chars[0].image[0].font[0];), onde acesso o primeiro byte do caractere '0', até ai sem problema.
Mais a pergunta é, como descobrir o tamanho de (const unsigned char image_data_FontX_0x30[50] ) dentro de uma struct encadeada?
Se faço sizeof(Font6.chars[0].image[0].font[0]) meu retorno é '1', que está certo pois me retorna um byte de tamanho.
Se faço sizeof(Font6.chars[0].image[0].font) meu retorno é '4', o por que eu não entendo.

Então como faço para ter o retorno '50' que é o tamanho do vetor?

Desde já agradeço.
"Mesmo o objeto mais inanimado tem movimento suficiente para ficar na sua frente e provocar um acidente."
"Even the most inanimate object has enough movement to stand in your way and cause an accident."
Avatar do usuário
ivan braga
Nibble
 
Mensagens: 60
Registrado em: 15 Dez 2006 18:02
Localização: Rio de Janeiro

Re: Como descobrir tamanho de um vetor em uma struct encadea

Mensagempor Rodrigo_P_A » 17 Mar 2012 14:27

ivan braga escreveu:Tem hora que dá um branco danado.
Vou explicar, já tentei de varias formas descobrir o tamanho de um vetor de bytes onde é guardada informações sobre um caractere que vou exibir no glcd.
Os arquivos são gerados usando este programa http://code.google.com/p/lcd-image-converter/.
Para facilitar o entendimento, segue um pequeno arquivo gerado pelo programa.

Código: Selecionar todos
// filename:
// name: FontX
// family: MS Shell Dlg 2
// size: 14
// style: Bold
// included characters: 012
// antialiasing: <value not defined>
// type: proportional
// encoding: UTF-8
//

typedef struct {
    const  unsigned char *font;
    const  int width;
    const  int height;
    } tImage;
typedef struct {
    const long int code;
    const tImage *image;
    } tChar;
typedef struct {
    const int length;
    const tChar *chars;
    } tFont;


const unsigned char image_data_FontX_0x30[50] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xf0, 0x78,
0xe0, 0x38,
0xc0, 0x18,
0xc2, 0x18,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0xc2, 0x18,
0xc0, 0x18,
0xe0, 0x38,
0xf0, 0x78,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
};
const tImage FontX_0x30 = { &image_data_FontX_0x30[0], 13, 25};


const unsigned char image_data_FontX_0x31[50] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xf8, 0x78,
0xf8, 0x78,
0xc0, 0x78,
0xc0, 0x78,
0xc0, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xf8, 0x78,
0xc0, 0x08,
0xc0, 0x08,
0xc0, 0x08,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
};
const tImage FontX_0x31 = { &image_data_FontX_0x31[0], 13, 25};


const unsigned char image_data_FontX_0x32[50] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xe0, 0x78,
0xc0, 0x18,
0xc0, 0x08,
0xde, 0x08,
0xff, 0x08,
0xff, 0x08,
0xff, 0x08,
0xfe, 0x18,
0xfe, 0x18,
0xfc, 0x38,
0xf8, 0x78,
0xf0, 0xf8,
0xe1, 0xf8,
0xc0, 0x00,
0xc0, 0x00,
0xc0, 0x00,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
};
const tImage FontX_0x32 = { &image_data_FontX_0x32[0], 13, 25};


const tChar FontX_array[] = {

// character: '0'
  {0x30, &FontX_0x30},
// character: '1'
  {0x31, &FontX_0x31},
// character: '2'
  {0x32, &FontX_0x32}
};

const tFont FontX = { 3, &FontX_array[0] };


Para acesso aos bytes do vetor faço por exemplo (Font6.chars[0].image[0].font[0];), onde acesso o primeiro byte do caractere '0', até ai sem problema.
Mais a pergunta é, como descobrir o tamanho de (const unsigned char image_data_FontX_0x30[50] ) dentro de uma struct encadeada?
Se faço sizeof(Font6.chars[0].image[0].font[0]) meu retorno é '1', que está certo pois me retorna um byte de tamanho.
Se faço sizeof(Font6.chars[0].image[0].font) meu retorno é '4', o por que eu não entendo.

Então como faço para ter o retorno '50' que é o tamanho do vetor?

Desde já agradeço.


Duvido muito que vc vai conseguir fazer isso ( usando sizeof), posso estar enganado mas tenho quase certeza que não.

Você num vai conseguir usar sizeof nesse caso pois o sizeof(Font6.chars[0].image[0].font) te devolve o valor do tamanho do ponteiro.

como ".font" é um ponteiro, você num tem como usar sizeof pois sizeof num é runtime cara, ele é do preprocessador do c, devolve o tamanho de um dado ou estrutura de dados que foi declarada e que o compilador sabe o tamanho. Não é possível em tempo de execução vc pegar o tamanho do dado da estrutura que o ponteiro está apontando usando o sizeof

seria o mesmo que vc tentar fazer:

int main ( void )
{
char str[100];
char *ptr;
int lenofvector;
ptr=&str[0];
lenofvector=sizeof(ptr);

}


neste exemplo lenofvector vai te devolver o tamanho em bytes ocupado pelo ponteiro ptr e não o tamanho 100 que é o que vc está esperando.

para isso você vai ter que colocar algum indicador na tua estrutura da fonte, sei lá, eu colocaria mais um dado 0x00 no fim dos dados ( não sei se pode nesta sua estrutura) e criaria uma rotina para calcular o tamanho

exemplo:

Código: Selecionar todos
const unsigned char image_data_FontX_0x30[] = {
    0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xf0, 0x78,
0xe0, 0x38,
0xc0, 0x18,
0xc2, 0x18,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0x87, 0x08,
0xc2, 0x18,
0xc0, 0x18,
0xe0, 0x38,
0xf0, 0x78,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8,
0xff, 0xf8
0x00,0x00  // <<<<< indicador do fim do vetor
};


int SizeOfFont( const unsigned char *ptr )
{
int len=0x00;
while ( *ptr )
{
len++;
ptr++;
}
return len;
}

// agora para saber o tamanho:
SizeOfFont( Font6.chars[0].image[0].font );

vai te devolver o tamanho.

é uma idéia, mas como tudo em programação tem outras formas de ser feito.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor fabim » 17 Mar 2012 15:21

o que seria uma estrutura encadeada ? agora eu fiquei confuso !!

A única coisa que sei, é que:
Se você criar uma estrutura com mais 100 estruturas dentro.

depois chamar o sizeof do nome da estrutura, caso não fosse um typedef, ele iria lhe retornar o numero de bytes.
Mas como o rodrigo lhe disse, não existe a possibilidade que você deseja.

Aconselho a você mudar sua concepção de programação também, esta forma ai é a mais porca e ingrata que eu já vi para gerar um bmp, mesmo que é bit pix.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ivan braga » 17 Mar 2012 15:29

Obrigado pelo retorno Rodrigo.

E sim já tinha percebido que usando esta abordagem com sizeof(), não conseguiria o resultado esperado.

No momento o que estou fazendo para contornar isto, é editar as declarações que são geradas automaticamente pelo programa. ex: ( const tImage FontX_0x30 = { &image_data_FontX_0x30[0], 13, 25}; ).

Depois de editado fica ( const tImage FontX_0x30 = { &image_data_FontX_0x30[0], 13, 25, 50}; ), e também edito a declaração da struct. "const int nBytes;"

Código: Selecionar todos
typedef struct {
    const  unsigned char *font;
    const  int width;
    const  int height;
    const  int nBytes;
    } tImage;


Resumindo, sabe quando se fica pensando, "que mer#%$, tem que ter um jeito de resolver isso".

Bom de qualquer forma obrigado. Vou continuar vendo se alguem tem uma outra abordagem.
"Mesmo o objeto mais inanimado tem movimento suficiente para ficar na sua frente e provocar um acidente."
"Even the most inanimate object has enough movement to stand in your way and cause an accident."
Avatar do usuário
ivan braga
Nibble
 
Mensagens: 60
Registrado em: 15 Dez 2006 18:02
Localização: Rio de Janeiro

Mensagempor Rodrigo_P_A » 17 Mar 2012 18:02

ivan braga escreveu:Obrigado pelo retorno Rodrigo.

E sim já tinha percebido que usando esta abordagem com sizeof(), não conseguiria o resultado esperado.

No momento o que estou fazendo para contornar isto, é editar as declarações que são geradas automaticamente pelo programa. ex: ( const tImage FontX_0x30 = { &image_data_FontX_0x30[0], 13, 25}; ).

Depois de editado fica ( const tImage FontX_0x30 = { &image_data_FontX_0x30[0], 13, 25, 50}; ), e também edito a declaração da struct. "const int nBytes;"

Código: Selecionar todos
typedef struct {
    const  unsigned char *font;
    const  int width;
    const  int height;
    const  int nBytes;
    } tImage;


Resumindo, sabe quando se fica pensando, "que mer#%$, tem que ter um jeito de resolver isso".

Bom de qualquer forma obrigado. Vou continuar vendo se alguem tem uma outra abordagem.


Nesta tua declaração vc pode usar o sizeof, mas pegando a estrutura que tem o dado
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil


Voltar para PIC

Quem está online

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

x