[Solucionado] Duda con paso de un array a una función.

Iniciado por Caster, 17 Julio 2013, 17:33 PM

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

Caster

Buenas, he estado leyendo sobre arrays y punteros en C y he leido no es obligatorio pasar todo el array a una funcion sino que se puede pasar solo una parte, por ejemplo:

#include <stdio.h>

void procesar(float z[]);

int main()
{
   float z[100];
   
   /*...codigo...*/
   
   procesar(&z[50]);
   
   /*...codigo...*/
   return 0;
}

void procesar(float *f)
{
   /*...codigo..*/
   return 0;
}


En este ejemplo, z es un array de 100 elementos pero en la funcionar procesar() solo se utilizaran a partir del elemento numero 50 en adelante, y la duda que me surge es, si yo solo quiero utilizar los 50 primeros elementos, es decir, desde el elemento z[0] hasta el elemento z[49], como lo indicaría en la llamada a la función.

la unica manera que se me ha ocurrido seria asi:

procesar(&z[100-51])
Saludos

eferion

Por partes:

float z[100];

En esa línea estás creando un vector de floats... has de saber que cada float, por si mismo, no sabe nada de su entorno:

* No sabe que pertenece a un vector
* No sabe qué posición ocupa.
* No sabe cual es el elemento anterior ( si tiene ).
* No sabe cual es el elemento siguiente ( si tiene ).

La única forma de saber el orden del vector es mediante el vector z.

Este coñazo te lo explico porque ahora, en esta línea:

procesar(&z[50]);

Estás pasando la posición de memoria donde se encuentra el elemento número 50 del vector... pero claro... ese elemento no tiene ni idea de lo que tiene a su alrededor... es un simple puntero a un float.

Si quieres que tu función recorra un número de elmentos consecutivos tienes que indicar la posición inicial dentro del vector y la final... la primera te servirá para saber dónde empezar el recorrido y la segunda para saber cuándo has terminado.

Dicho con código... tu llamada tendría que tener, por ejemplo, esta forma:

procesar(&z[50], &z[99]);

Le pasas el primer elemento de la secuencia, es decir, el 51 ( recuerda que los índices empiezan a contar desde el 0 ), y el último el 100.

Y la función tendría que tener una cabecera tal que...

void procesar( float* f_ini, float* f_fin )

Y ahí ya tienes todo lo necesario para trabajar... solo tienes que ir incrementando el puntero f_ini hasta que coincida con f_fin y listo.

Recuerda que f_fin también forma parte del array... por lo que también has de procesarlo.

Y luego tienes la opción b... que es pasar el puntero a la primera posición a procesar dentro del vector y a la vez el número de elementos a procesar:


// ...
procesar( &z[50], 50 );
// ...

void procesar( float* f, int longitud )
{
  // ...
}


En este caso tendrás que llevar tú la cuenta del número de incrementos en el puntero f para no pasarte.


amchacon

Cita de: Caster en 17 Julio 2013, 17:33 PM
Buenas, he estado leyendo sobre arrays y punteros en C y he leido no es obligatorio pasar todo el array a una funcion sino que se puede pasar solo una parte, por ejemplo.
Los arrays no se pasan como parámetro a una función, en su lugar se pasa un puntero a su primer elemento (todo esto de forma transparente para ti).

Eso quiere decir, que da igual que uses 10,20,30 elementos... No estás copiando el array asi que en cuestión de rendimiento te da igual.

Otra cosa esque le pases otro parámetro para orientarte cuantos elementos son... Ese es el método que te ha propuesto eferion.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Caster

#3
Cita de: eferion en 17 Julio 2013, 17:44 PM
Por partes:

float z[100];

En esa línea estás creando un vector de floats... has de saber que cada float, por si mismo, no sabe nada de su entorno:

* No sabe que pertenece a un vector
* No sabe qué posición ocupa.
* No sabe cual es el elemento anterior ( si tiene ).
* No sabe cual es el elemento siguiente ( si tiene ).

La única forma de saber el orden del vector es mediante el vector z.


No entiendo muy bien por que me dices esto, no entiendo que tiene que ver una cosa con la otra. A ver si lo entiendo, me estas queriendo decir que como cada float no sabe que pertenece a un vector y tampoco sabe su ubicacion, tengo que indicar la primera posicion desde la que quiero empezar, y la final donde quiero terminar?

Cita de: amchacon en 17 Julio 2013, 19:08 PM
Los arrays no se pasan como parámetro a una función, en su lugar se pasa un puntero a su primer elemento (todo esto de forma transparente para ti).
Perdón, me he expresado mal, ya se que es un puntero a la direccion del primer elemento y a partir de ahi se accede a los demas por desplazamiento lineal, lo que queria decir es que no es obligatorio acceder siempre a partir del primer elemento, sino que se puede desde cualquiera elemento del array.

Saludos

eferion

Estaba un poco ofuscado cuando te escribí y creo que no fui lo suficientemente claro, perdón.

Lo que quería decir es que al final tienes que trabajar con posiciones de memoria puras y duras... si quieres que una función procese un vector de cualquier longitud necesita una posición de memoria por la que comenzar y una de dos, o bien una posición de memoria en la que terminar, o bien el número de elementos.

Pero lo que está claro es que, con solo una posición de memoria no hay forma de saber en qué punto has de terminar de procesar elementos, siempre necesitarás algo que te diga cuándo terminar.

Caster

Entonces el codigo que puse esta bien o no?

eferion


Caster

No es ningun codigo completo, era un ejemplo copiado exactamente del libro, que me lo explicaba asi, lo que ahora quiero saber es si es obligatorio saber la posicion final del array, porque segun me explica el libro y como muestra el ejemplo que puse, solo hace falta la posicion de partida.

Saludos

eferion

Si por defecto solo vas a gestionar un numero conocido y fijo de elementos, 20 por ejemplo, no necesitas nada más que el puntero al principio del vector de elementos... pero si el número es, a priori, aleatorio... necesitas conocer el final.

Es como seguir un camino... si no sabes cual es el final no puedes saber si has llegado por mucho que andes

Caster

Vale, todo solucionado entonces, muchas gracias.

Saludos