[Solucionado] -> [Ayuda] Saber el indice mayor de una rreglo (Cual sea)..

Iniciado por BlackZeroX, 31 Octubre 2010, 02:07 AM

0 Miembros y 1 Visitante están viendo este tema.

BlackZeroX

.
El siguiente codigo me carga el maximo indice que es 1 cuando yo se que es 2000... cual es mi error?

Código (cpp) [Seleccionar]


int *arreglo = new int[];
int i = 2000;
arreglo = (int*) malloc (i * sizeof(int));
::cout << ubound(arreglo) << ::endl;
free(arreglo);
getchar();



Codigo de Ubound()

Código (cpp) [Seleccionar]


unsigned long __stdcall ubound (int *arr) {
return(sizeof(arr) / sizeof(arr[0]));
}



Dulce Lunas!¡.

Lh: No hagas doble post. Utiliza el botón modificar.

.
Despues de mucho probar y probar di con la solucion...

Código (cpp) [Seleccionar]


#define ubound(arr) ((sizeof(arr))/(sizeof(*arr)))



Dulce Infierno Lunar!¡.
The Dark Shadow is my passion.

Littlehorse

#1
Esta mal, de hecho es imposible que eso te funcione.

Lo primero, estas mezclando new y malloc sin sentido. Esta linea no tiene sentido:

Código (cpp) [Seleccionar]

int *arreglo = new int[];


New




Lo segundo, sizeof es un operador que funciona en tiempo de compilación, por tanto es imposible que sepas de esa forma cual es el tamaño del arreglo dado que las llamadas de reserva de memoria se hacen en tiempo de ejecución.

Lo que estas haciendo con ese macro es basicamente algo como "Tamaño del puntero/tamaño del primer elemento del arreglo" entonces por ejemplo puntero=4 bytes, entero=4bytes. 4/4=1.

Tu macro funcionaria solamente con los arreglos estáticos, algo así:

Código (cpp) [Seleccionar]
int arreglo[2000];
cout<<sizeof arreglo/sizeof(int);


Y en ese caso sizeof devolvería, por ejemplo, algo como 8000/4=2000.

En el caso de los arreglos de enteros dinámicos, no hay manera portable de saber el tamaño salvo utilizando funciones especificas del sistema u manteniendo el tamaño en alguna variable/constante/define etc.


Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.