Calcular tamanho de array dinamicamente

958 views
Skip to first unread message

William Paiva

unread,
Sep 30, 2013, 11:37:36 AM9/30/13
to ccppbrasil
Boa tarde pessoal, 

Desenvolvendo aqui acabei ficando com mais uma dúvida, como eu faço para calcular o tamanho de um vetor dinâmico de void em C em tempo de execução?

Exemplo:


//Para um vetor de int tentei assim e funcionou
unsigned int getTam(int dados[]){
    return sizeof(dados) / sizeof(int);
}

//Para um char*/char[] posso usar o strlen

e para um void[]/void*?

Att.



Rafael Dias

unread,
Sep 30, 2013, 11:49:16 AM9/30/13
to ccppb...@googlegroups.com
vc pode fazer algo t锟給 simples como:

#define getTam(x) (sizeof(x) / sizeof(x[0]) )



William Paiva wrote:
> Boa tarde pessoal,
>
> Desenvolvendo aqui acabei ficando com mais uma d锟絭ida, como eu fa锟給
> para calcular o tamanho de um vetor din锟絤ico de void em C em tempo de
> execu锟斤拷o?
>
> Exemplo:
>
>
> //Para um vetor de int tentei assim e funcionou
> unsigned int getTam(int dados[]){
> return sizeof(dados) / sizeof(int);
> }
>
> //Para um char*/char[] posso usar o strlen
>
> e para um void[]/void*?
>
> Att.
>
>
>
> --
> Antes de enviar um e-mail para o grupo leia:
> http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~---------------------------------~----------~--~----~
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para
> ccppbrasil-...@googlegroups.com
> Para mais op锟斤拷es, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
> Emprego & carreira: vag...@ccppbrasil.org
> http://groups.google.com/group/dev-guys?hl=en
>

Francisco Lopes

unread,
Sep 30, 2013, 11:51:05 AM9/30/13
to ccppb...@googlegroups.com
arrays decaem para ponteiros, isto não é possível.

Em Seg, Set 30, 2013 em 12:49 ,Rafael Dias <rdme...@yahoo.com.br> escreveu:
vc pode fazer algo tão simples como: #define getTam(x) (sizeof(x) / sizeof(x[0]) ) William Paiva wrote:
Boa tarde pessoal, Desenvolvendo aqui acabei ficando com mais uma dúvida, como eu faço para calcular o tamanho de um vetor dinâmico de void em C em tempo de execução? Exemplo: //Para um vetor de int tentei assim e funcionou unsigned int getTam(int dados[]){ return sizeof(dados) / sizeof(int); } //Para um char*/char[] posso usar o strlen e para um void[]/void*? Att. -- Antes de enviar um e-mail para o grupo leia: http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar --~--~---------~--~----~---------------------------------~----------~--~----~ [&] C & C++ Brasil - http://www.ccppbrasil.org/ Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com Para mais opções, visite http://groups.google.com/group/ccppbrasil --~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~ Emprego & carreira: vag...@ccppbrasil.org http://groups.google.com/group/dev-guys?hl=en
--
Antes de enviar um e-mail para o grupo leia: http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar --~--~---------~--~----~---------------------------------~----------~--~----~ [&] C & C++ Brasil - http://www.ccppbrasil.org/ Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com Para mais opções, visite http://groups.google.com/group/ccppbrasil --~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~ Emprego & carreira: vag...@ccppbrasil.org http://groups.google.com/group/dev-guys?hl=en

Rodrigo Madera

unread,
Sep 30, 2013, 11:58:39 AM9/30/13
to ccppb...@googlegroups.com
William,

Primeiro, você não pode. Conseguiria somente no bloco onde foi definida tua estrutura. Você precisa manter o tamanho separado numa variável, ou bem indicando o fim de um array usando um valor especial num elemento de void*, como 0.

Segundo, você está usando void*. Isso raramente é uma boa ideia.

Fala o que você pretende que podem aparecer sugestões melhores de uso.

Sugiro ler mais uma vez o artigo de arrays do PontoV. Pesquisa no histórico da lista ou no Google que você acha.

Boa sorte,
Mx

William Paiva

unread,
Sep 30, 2013, 11:58:52 AM9/30/13
to ccppbrasil
Rafael como o Fransico já disse, um ponteiro faz decay para array, assim sendo quando eu uso o sizeof ele vai me retornar o tamanho do ponteiro (1 a 8) o que não resolve o problema, pois é falho. =\

essa solução funciona para um void[] mas não para um void*, o void* é realmente o grande problema


2013/9/30 Francisco Lopes <obl...@gmail.com>

William Paiva

unread,
Sep 30, 2013, 12:05:57 PM9/30/13
to ccppbrasil
Eu tava lendo ele agora msm...xD

li o artigo dele e esse http://www.ronaldolima.eti.br/2012/04/06/o-tipo-void/, os dois são mto bons. e me ajudaram a enxergar o decay dos arrays e ponteiros (até que enfim..rs)

Bom o que eu estou fazendo é o seguinte: eu tenho que transformar um código Java em um código C/C++, e no Java o cara usava o tipo object. Fazendo várias buscas cheguei a conclusão que a melhor forma de representar o object seria com o uso de template ou void*, e lendo mais um pouco vi que o void* é o mais rápido, logo estou aqui tentando entender como usar ele, pois em uma determinada função o cara utilizava um array de object, o que ao meu ver pode ser traduzido como void*, o problema é que utilizando um void* eu não sei o tamanho do array, pois diferente do java não existe um .size genérico para tais estruturas.

Não sei se estou fazendo da melhor forma, mas pelo que li é o melhor jeito. Alguma outra sugestão?

Francisco Lopes

unread,
Sep 30, 2013, 12:15:00 PM9/30/13
to ccppb...@googlegroups.com
Pra parte container da questão, use um std::vector e seus problemas de saber tamanho se resolvem.

William Paiva

unread,
Sep 30, 2013, 12:23:19 PM9/30/13
to ccppbrasil
ok, e se eu quiser exportar essa função? um app em java ou c# conseguiriam identificar o std::vector?

Marcelo Zimbres

unread,
Sep 30, 2013, 12:37:08 PM9/30/13
to ccppb...@googlegroups.com
"Pra parte container da questão, use um std::vector e seus problemas
de saber tamanho se resolvem."

Pelo que eu entendi, ele tem o tamanho em tempo de compilação. Nesse
caso std::array, boost::array, ou T foo[size]; bastam e não tem o over
head de uma alocação dinâmica.

Marcelo

William Paiva

unread,
Sep 30, 2013, 12:41:01 PM9/30/13
to ccppbrasil
Não Marcelo, eu nao possuo o tamanho em tempo de compilação, o array é dinâmico.

Rodrigo Madera

unread,
Sep 30, 2013, 12:42:11 PM9/30/13
to ccppb...@googlegroups.com
William,

O que você vai fazer com esses void* em tempo de execução?

Irá ler ou escrever neles?

Mx


2013/9/30 William Paiva <willm...@gmail.com>

William Paiva

unread,
Sep 30, 2013, 1:08:58 PM9/30/13
to ccppbrasil
Eu vou escrever em dois momentos do código, depois só realizarei leituras.

Francisco L. Silva

unread,
Sep 30, 2013, 1:16:17 PM9/30/13
to ccppb...@googlegroups.com
se está pensando em construir uma api pra uso em diversas linguagens, melhor é manter uma api C somente. Se quiser usar c++ internamente somente, sem problemas. Com uma api C o que vc tem disponível é apenas expor ponteiros opacos para seus objetos que só a sua lib saberá lidar com.

William Paiva

unread,
Sep 30, 2013, 1:47:11 PM9/30/13
to ccppbrasil
Sim francisco, eu pensei exatamente nisso, daí a dúvida sobre o tamanho de um void* (ele é o tipo mais próximo de object em c) pois como eu irei receber um array que eu não saberei o tamanho gostaria de calcula-lo em tempo de execução. Estou pensando errado?

Vinicius Santos

unread,
Sep 30, 2013, 1:53:18 PM9/30/13
to ccppb...@googlegroups.com
Sim francisco, eu pensei exatamente nisso, daí a dúvida sobre o tamanho de um void* (ele é o tipo mais próximo de object em c) pois como eu irei receber um array que eu não saberei o tamanho gostaria de calcula-lo em tempo de execução. Estou pensando errado?

 
Um void* é apenas um ponteiro.

Você terá que convertê-lo em algum momento para um tipo real, se quiser fazer algo de útil com ele. Pode ser int, char, double, minhaStruct, etc.

A pergunta é: qual é o tipo?

Уθя¡ςκ

unread,
Sep 30, 2013, 1:53:49 PM9/30/13
to ccppb...@googlegroups.com
Se vc expor void* na interface (ou seja nos prototipo das funções), mas internamente sabe que o ponteiro void * aponta para um vector de qualquer coisa, ou apontar pra qualquer objeto de um tipo qualquer que vc deseje, vc faz o cast na implementação interna e segue a vida. O que vc precisar expor a mais para montar suas estruturas complexas internas, tamanho essas coisas, vc faz através de tipos básicos C. Mas que internamente pode ser mapeado pra usa na construção de um vector e tal.

Ziviani

unread,
Sep 30, 2013, 1:57:05 PM9/30/13
to Brasil [ C++ ]
William,

A melhor formar de representar um object Java em C seria usando struct, ou class em C++. O JNI faz isso.


/*
 * JNI Types
 */

typedef unsigned char	jboolean;
typedef unsigned short	jchar;
typedef short		jshort;
typedef float		jfloat;
typedef double		jdouble;

typedef jint            jsize;

#ifdef __cplusplus

class _jobject {};
class _jclass : public _jobject {};
<snip>

typedef _jobject *jobject;
<snip>

#else

struct _jobject;

typedef struct _jobject *jobject;
typedef jobject jclass;
<snip>

#endif


2013/9/30 William Paiva <willm...@gmail.com>
Reply all
Reply to author
Forward
0 new messages