Discussion:
conocer dimension de un array dinámico
(demasiado antiguo para responder)
Wein
2005-11-08 10:10:29 UTC
Permalink
Hola que tal!

Pues el tema es el siguiente, y es que no se como demonios averiguar las
dimensiones de un array creado de forma dinámica. Para mas datos diré que el
array es sobre una clase. Ejemplo:

......

Class Miclase {
public:
int x;
};

int c=10;
Miclase *clase=NULL;

clase = new Miclase[c];
.....

¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
lo he intentado con sizeof, pero solo me da el tamaño del primer elemento...
¿existe algo tipo 'ubound' que devuelva las dimensiones?

Gracias y un saludo.
Zara
2005-11-08 10:26:47 UTC
Permalink
Post by Wein
Hola que tal!
Pues el tema es el siguiente, y es que no se como demonios averiguar las
dimensiones de un array creado de forma dinámica. Para mas datos diré que el
......
Class Miclase {
int x;
};
int c=10;
Miclase *clase=NULL;
clase = new Miclase[c];
.....
¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
lo he intentado con sizeof, pero solo me da el tamaño del primer elemento...
¿existe algo tipo 'ubound' que devuelva las dimensiones?
Gracias y un saludo.
No utilices matrices como esas, son la fuente de la mayor parte de los
errores.

Deberías usar algo como esto

#include <vector>

....

struct Miclase {
int x;
};

...

size_t c=10;

std::vector<Miclase> clase(c);
....

size_t tamanho=clse.size();

.....


Es portable, es estándar C++, es seguro... es lo que necesitas

Saludos,

-- Zara
Wein
2005-11-08 11:09:13 UTC
Permalink
Muchas gracias!!

Esto era lo que necesitaba!
Post by Zara
Post by Wein
Hola que tal!
Pues el tema es el siguiente, y es que no se como demonios averiguar las
dimensiones de un array creado de forma dinámica. Para mas datos diré que el
......
Class Miclase {
int x;
};
int c=10;
Miclase *clase=NULL;
clase = new Miclase[c];
.....
¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
lo he intentado con sizeof, pero solo me da el tamaño del primer elemento...
¿existe algo tipo 'ubound' que devuelva las dimensiones?
Gracias y un saludo.
No utilices matrices como esas, son la fuente de la mayor parte de los
errores.
Deberías usar algo como esto
#include <vector>
....
struct Miclase {
int x;
};
...
size_t c=10;
std::vector<Miclase> clase(c);
....
size_t tamanho=clse.size();
.....
Es portable, es estándar C++, es seguro... es lo que necesitas
Saludos,
-- Zara
Pedro Maicas
2005-11-08 19:20:17 UTC
Permalink
Post by Wein
¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
Yo creo que si haces esa pregunta, tienes un grave problema
para programar en C o C++, no importa que aprendas a usar <vector>,
además tambien deberías entender cómo funciona el C, como se
reserva memoria en la pila, o en el heap, o estáticamente, etc ...


Saludos :-)
-Pedro-
Wein
2005-11-09 10:04:59 UTC
Permalink
Post by Pedro Maicas
Post by Wein
¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
Yo creo que si haces esa pregunta, tienes un grave problema
para programar en C o C++, no importa que aprendas a usar <vector>,
además tambien deberías entender cómo funciona el C, como se
reserva memoria en la pila, o en el heap, o estáticamente, etc ...
Saludos :-)
-Pedro-
¿y por qué lo dices?

Veamos, tal vez no planteé bien el problema, aunque ya me lo resolvió Zara
muy amablemente, y cierto es que soy muy novato en esto de C/C++, pero
intentarlo lo intento, y cuando pregunté lo anterior es porque no encontré
otra solución mirando algunos manuales y web.

El problema..., no seré un experto en reservar memoria en la pila, heap o lo
que quieras, pero al hacer...

clase = new Miclase[c];

... ¿no estoy reservando memoria de 'c' elementos del tipo Miclase? ¿y a la
vez no he dejado el puntero clase inicializado?...
El problema seguia mas adelante, ya que no se leer el tamaño de la dirección
de memoria para encontrar el número de elementos, es decir, si pongo...

tamanio = sizeof(clase) ;

me devuelve el tamaño del puntero, no del contenido, como es lógico. Y si
pongo...

tamanio = sizeof(*clase);

me devuelve el tamaño del tipo de dato 'Miclase'. ¿Cómo averiguar la
dimensión del
array clase?. Pues una manera sería...

tamanio = sizeof(*clase) * c;

Pero esto no me sirve, pues 'clase' la uso en diversas funciones del
programa, y creo que no sería correcto tener que pasar en cada función que
haga uso de ella el parámetro 'c' para calcular la dimensión. De ahí la
pregunta ¿como averiguar la dimensión del array clase sin tener que
arrastrar la variable c por todo el programa?.

De todas formas, gracias por la crítica 'constructiva'...

Un saludo,
Juanjo.
Pedro Maicas
2005-11-09 23:32:59 UTC
Permalink
Post by Wein
De todas formas, gracias por la crítica 'constructiva'...
Lo siento si no ha sonado a critica constructiva, pero realmente
pretendía serlo.

Todo lo que dices es cierto, no puedes saber el tamaño si
no te ocupas personalmente de guardarlo en algun sitio, el
compilador no te lo soluciona.

Lo que pasa que me parece una cosa tan elemental que no
me imagino que puedas trabajar con plantillas (vector), etc...
y a la vez no saber una cosa tan basica.

De todas formas olvidalo, son manias mías.

Saludos :-) -Pedro-

http://www.maicas.net/

e-mail en www.maicas.net
j***@terra.es
2005-11-10 14:04:46 UTC
Permalink
Post by Wein
Hola que tal!
Pues el tema es el siguiente, y es que no se como demonios averiguar las
dimensiones de un array creado de forma dinámica. Para mas datos diré que el
......
Class Miclase {
int x;
};
int c=10;
Miclase *clase=NULL;
clase = new Miclase[c];
.....
¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
lo he intentado con sizeof, pero solo me da el tamaño del primer elemento...
¿existe algo tipo 'ubound' que devuelva las dimensiones?
Gracias y un saludo.
Sólo si en vez de definir un puntero apuntando a un array, defines el
array en la pila. Ten en cuenta que el operador sizeof tiene que
conocer en tiempo de compilación el valor de sus argumentos, entonces
te quedaría:

Myclase clase[10];
std::size_t tam = sizeof(clase)/sizeof(clase[0]);

Aquí el identificador del array no se evalúa a la dirección del
primer elemenento como ocurre siempre excepto con el operador sizeof ,
la inicialización de referencias no constantes y algún caso más.
Pero como te han dicho, es mucho mejor usar el std::vector

Un saludo.
Wein
2005-11-14 10:05:11 UTC
Permalink
Ok, gracias, aunque tu caso se aplique a un array estático, mientras que
necesitaba un caso para un array dinámico, pero siempre se aprende algo.

Un saludo.
Post by Wein
Hola que tal!
Pues el tema es el siguiente, y es que no se como demonios averiguar las
dimensiones de un array creado de forma dinámica. Para mas datos diré que el
......
Class Miclase {
int x;
};
int c=10;
Miclase *clase=NULL;
clase = new Miclase[c];
.....
¿como averiguar la dimensión del array clase sin tener que arrastrar la
variable c por todo el programa?
lo he intentado con sizeof, pero solo me da el tamaño del primer elemento...
¿existe algo tipo 'ubound' que devuelva las dimensiones?
Gracias y un saludo.
Sólo si en vez de definir un puntero apuntando a un array, defines el
array en la pila. Ten en cuenta que el operador sizeof tiene que
conocer en tiempo de compilación el valor de sus argumentos, entonces
te quedaría:

Myclase clase[10];
std::size_t tam = sizeof(clase)/sizeof(clase[0]);

Aquí el identificador del array no se evalúa a la dirección del
primer elemenento como ocurre siempre excepto con el operador sizeof ,
la inicialización de referencias no constantes y algún caso más.
Pero como te han dicho, es mucho mejor usar el std::vector

Un saludo.

Continúe leyendo en narkive:
Loading...