C/Visual C - Averiguar la longitud de un vector

 
Vista:

Averiguar la longitud de un vector

Publicado por gerard (1 intervención) el 12/07/2005 10:26:07
Bien,lo que me gustaria saber es la longitud que tiene un vector que se recibe en una funcion,sin tener que especificarselo como parametro.

Por ejemplo,supongamos que tengo una funcion que me ordena un vector.Lo que yo quiero es que en la funcion que me lo ordena se pueda saber su longitud,sin tener que especificarselo en la llamada como parametro.

Al principio probé lo siguiente

int longitud;
int vec[234];

longitud=sizeof(vec)/sizeof(vec[0]);//o bien longitud=sizeof(vec)/sizeof(int);

Esto funciona sin problemas si lo haces en la misma funcion en donde te declaras el vector,pero no si por ejemplo haces....

ordena_vector(vec);

void ordena_vector(int *vector)
{
int longitud;

longitud=sizeof(vector)/sizeof(vector[0]);
}

Esto no funciona porque lo que calcula sizeof es el tamaño del puntero pero no del vector entero.Es decir devuelve 1,porque divide 2 entre dos.



Ya sé que normalmente se envia un parametro extra indicando la longitud,pero me gustaria saber,y estoy seguro de que debe de existir,una manera de saberla "al vuelo".

Saludos gente del C.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Averiguar la longitud de un vector

Publicado por Franco Cedillo (36 intervenciones) el 16/07/2005 09:44:28
Hola,

Si pues, yo en una clase sobre otro tema, me la pasé pensando. Era en lenguaje pascal. Pero vayamos a lo general.
1. No creo que exista una función predefinida. Porque es una estructura que ya tiene un tamaño declarado. Si no haces hardcode (o sea si no llenas de números fijos tu codigo y por ejemplloo usaste int[num_datos] entonces ya tienes el tamaño en una variable. Simplemente la pasas por parámetro porque ya la tienes noes un
claculo mnás. El programa es eficiente.
2. La idea del size of es muy buena. Si es que no hay más que elementos en el vector. Si pones alguna cabecera o marca al final, esto también esmanejable.
3. La idea del sizeof supongo que es igual que en pascal, te devuelve el tamaño en bytes con lo que es una división entera. Buena idea. Pero también hay que tomar en cuenta, marcas y cabeceras.
4. Un puntero te puede señalar, por ejemplo, el fin del vector, su inicio y al mismo tiempo tener entre sus propiedades la longitud.

Ahora las ideas bonitas.
===================

5. Si puedes manejar el input y output del sistema sería interesante poder detectar el error de acceso. Es decir que sea un error ingresar a un elemento de un índice mayor que el máximo declarado. Pero esto es como usar marcas ya que por naturaleza un vector no es estático en C++.
6. Puedes trabajar con un vector de pequeños registros. Cada registro tiene un elemento y un puntero al siguiente registro. Si no hay elemento siguiente el fin apunta a NULL. Este vector puede ser simplemente enlazado o doblemente enlazado. También puedes enlaar más términos si le encuentras alguna utilidad práctica. Lo conviertes en una cola si los elementos que agregas se colocan al final y cuando retiraqs uno sólo puede ser el primero. Se convierte en una pila si colocas elemente tras elemento y sólo puedes retirar el último ingresado. Estas dos ideas son recursivas. Aunque la implementación puede ser iterativa. No vayas contra la naturaleza todo se complica.
7. Puedes contar los elementos avanzando hasta llegar a NUL. Te cuento algo bien ch v r.. si haces el vector circular nada se complica. Sólo que el fin es cuando llegas al primer elemento por segunda vez. La inserción en todos los casos puede ser al inicio, al final,. o facilitarse.. en el caso de la circular es más fácil colocarlo en la segunda posición.

Ls próxima semana inicio el estudio de búsqueda y ordenamiento en c++

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar