Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: statham en 31 Enero 2019, 19:25 pm



Título: Funcion que devuelva un array
Publicado por: statham en 31 Enero 2019, 19:25 pm
Buenas, es posible que llamando a una función desde el main(por ejemplo u otra) te devuelva un array??

Se que es posible, ya que tu al llamar a la funcion le pasas el array y te rellena los datos.

La cosa viene cuando el tamaño de dicho array no lo sabes hasta que llamas a esa función , entonces como puedes pasarle un array sin saber su tamaño? tampoco podrías igualar dicho array al array que te devuelve la función por que no sabes el tamaño.


Como podria crear un array vacio o un array de tamaño dinamico?


Un saludo.


Título: Re: Funcion que devuelva un array
Publicado por: MAFUS en 31 Enero 2019, 21:34 pm
Debes crear un array de forma dinámica dentro de la función y devolver su puntero. Una vez que dejes de usar debes liberarlo.

*** Muy importante que sea un array dinámico porque se crea en el heap, no en la pila. Si devuelves un puntero a un objeto creado de forma local, en la pila, en un función que va a desaparecer, va a regresar, te encontrarás con problemas de memoria.


Título: Re: Funcion que devuelva un array
Publicado por: EdePC en 1 Febrero 2019, 03:17 am
Saludos,

- Yo suelo solicitar al usuario el tamaño del array y crearlo en vivo:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  int cantidad;
  5.  printf("Indique la cantidad de elementos del Array: ");
  6.  scanf("%d", &cantidad);
  7.  int array[cantidad];
  8.  for (int i = 0; i < cantidad; i++) {
  9.    array[i] = i;
  10.  }
  11.  for (int i = 0; i < cantidad; i++) {
  12.    printf("%d\n", array[i]);
  13.  }
  14.  return 0;
  15. }

- Sin embargo he estado leyendo varios libros de programación en C y veo que casi ninguno habla de lo que hago. Es bastante sencillo utilizar el método que expongo, pero por lo que he leído, esto no es Estándar y muchos compiladores darán error.

-- Yo uso MinGW (gcc, g++, 6.3.0) y nunca me ha dado problemas al respecto así que ni enterado.

- La mayoría de los libros solo hablan de Arrays estáticos (int array[5], #define SIZE 5; int array[SIZE], int array[] = {1, 2, 3, 4, 5}), luego pasan directamente a Arrays dinámicos con punteros y malloc, free y NULL.

- Recomiendo este libro gratuito en español que justo trato el tema: Vectores Estáticos (pág. 63), Memoria Dinámica (pág. 213):
https://openlibra.com/es/book/introduccion-a-la-programacion-con-c-3

-- Y este par más que son bastante prácticos con varios ejemplos con malloc y free:
https://openlibra.com/es/book/fundamentos-de-programacion-en-c
https://openlibra.com/es/book/apuntes-de-la-materia-de-programacion-basica


Título: Re: Funcion que devuelva un array
Publicado por: statham en 1 Febrero 2019, 11:20 am
Saludos,

- Yo suelo solicitar al usuario el tamaño del array y crearlo en vivo:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  int cantidad;
  5.  printf("Indique la cantidad de elementos del Array: ");
  6.  scanf("%d", &cantidad);
  7.  int array[cantidad];
  8.  for (int i = 0; i < cantidad; i++) {
  9.    array[i] = i;
  10.  }
  11.  for (int i = 0; i < cantidad; i++) {
  12.    printf("%d\n", array[i]);
  13.  }
  14.  return 0;
  15. }

- Sin embargo he estado leyendo varios libros de programación en C y veo que casi ninguno habla de lo que hago. Es bastante sencillo utilizar el método que expongo, pero por lo que he leído, esto no es Estándar y muchos compiladores darán error.

-- Yo uso MinGW (gcc, g++, 6.3.0) y nunca me ha dado problemas al respecto así que ni enterado.

- La mayoría de los libros solo hablan de Arrays estáticos (int array[5], #define SIZE 5; int array[SIZE], int array[] = {1, 2, 3, 4, 5}), luego pasan directamente a Arrays dinámicos con punteros y malloc, free y NULL.

- Recomiendo este libro gratuito en español que justo trato el tema: Vectores Estáticos (pág. 63), Memoria Dinámica (pág. 213):
https://openlibra.com/es/book/introduccion-a-la-programacion-con-c-3

-- Y este par más que son bastante prácticos con varios ejemplos con malloc y free:
https://openlibra.com/es/book/fundamentos-de-programacion-en-c
https://openlibra.com/es/book/apuntes-de-la-materia-de-programacion-basica

Buenas gracias por responder, en mi caso no podria meterlo por teclado o pedirselo al usuario, ya que el tamaño viene indicado en un fichero por tanto hay que leerlo.

voy a intentar hacerlo con un array dinamico con puntero, o como solucion al sucia pero valida  leere el tamaño del array en el main, creo el array y luego llamare a la funcion pasandole el descriptor del fichero junto con el array.

un saludo.