Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juancaa en 19 Julio 2012, 01:43 am



Título: Funcion que retorne char array?
Publicado por: juancaa en 19 Julio 2012, 01:43 am
Buenas, me gustaria saber si es posible devolver un array de caracteres y como. La verdad es que he probado bastantes cosas y rebuscado en google pero no he hallado la forma de hacerlo, tal vez con punteros...

Ejemplo en codigo :
Código
  1. int len = 20;
  2. char str[len];
  3. str = read_array(len);

He probado con varias cosas y nada, no hay manera, alguien me puede ayudar con esto porfa?


Título: Re: Funcion que retorne char array?
Publicado por: DickGumshoe en 19 Julio 2012, 01:48 am
¡Hola!

Para crear una función que devuelva un array de caracteres debes hacer esto:

Código
  1. char* devolverArray()
  2. {
  3. //Aquí el código de la función
  4. return array_de_caracteres;
  5. }
  6.  
  7. int main()
  8. {
  9. //Código de main()
  10. cad = devolverArray();
  11. //resto de código de main()

Es decir, debes indicar que vas a devolver un char*, y retornar una variable de dicho tipo.

Saludos!


Título: Re: Funcion que retorne char array?
Publicado por: juancaa en 19 Julio 2012, 02:36 am
No hay manera, haber si puedes ayudarme, este es mi codigo basado en tu ejemplo:

Código
  1. #include <stdio.h>
  2.  
  3. char* func () {
  4. char txt2[20];
  5. printf("\nIntroduce word = ");
  6. scanf("%s", &txt2);
  7. return txt2;
  8. }
  9.  
  10. int main () {
  11. int len = 20;
  12. char str[20];
  13. str = func();
  14. printf("\nResult = %s.", str);
  15. return 0;
  16. }

Error :

Código:
	test.cpp: In function 'char* func()':
test.cpp:4:7: warning: address of local variable 'txt2' returned [enabled by default]
test.cpp: In function 'int main()':
test.cpp:13:13: error: incompatible types in assignment of 'char*' to 'char [20]'

En que me equivoco??


Título: Re: Funcion que retorne char array?
Publicado por: leogtz en 19 Julio 2012, 02:41 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char* func(void) {
  5. char *txt2 = malloc(20);
  6. printf("\nIntroduce word = ");
  7. scanf("%s", txt2);
  8. return txt2;
  9. }
  10.  
  11. int main(void) {
  12. int len = 20;
  13. char *str = func();
  14. printf("\nResult = %s.", str);
  15. free(str);
  16. return EXIT_SUCCESS;
  17. }
  18.  
  19.  


Título: Re: Funcion que retorne char array?
Publicado por: avesudra en 19 Julio 2012, 02:42 am
Vamos a ver , estás devolviendo un puntero , a una cadena de carácteres , si todavía no sabes que son los punteros pues como indica su nombre son apuntadores¿a qué? a direcciones de memoria, entonces char tx2[20] es un puntero que puede variar 20 posiciones, como se le ha indicado , pero claro tu estás asignando un puntero que se retorna de una función , a un array de carácteres.Y eso no es así , te dejo el código corregido:
Código
  1. #include <stdio.h>
  2.  
  3. char* func () {
  4. char txt2[20];
  5. printf("\nIntroduce word = ");
  6. scanf("%s", &txt2);
  7. return txt2;
  8. }
  9.  
  10. int main () {
  11. int len = 20;
  12. char *str; //Puntero al inicio de la variable txt2 , o sea a txt2 [0]
  13. str = func();
  14. printf("\nResult = %s.", str);
  15. return 0;
  16. }ara que te quede bien sería:


Título: Re: Funcion que retorne char array?
Publicado por: rir3760 en 19 Julio 2012, 03:13 am
No hay manera, haber si puedes ayudarme,

...

Error :
Código:
	test.cpp: In function 'char* func()':
test.cpp:4:7: warning: address of local variable 'txt2' returned [enabled by default]
test.cpp: In function 'int main()':
test.cpp:13:13: error: incompatible types in assignment of 'char*' to 'char [20]'

En que me equivoco??
Lo primero que debes aclarar es el lenguaje de programación que estas utilizando ya que el código fuente es C pero la extensión "cpp" sugiere que es C++. ¿Cual de ellos?

Si se trata de C debes seguir la solución de Leo Gutiérrez y si se trata de C++ puedes utilizar la clase string.

Un saludo


Título: Re: Funcion que retorne char array?
Publicado por: juancaa en 19 Julio 2012, 03:17 am
Gracias por vuestras respuestas!
Respecto al codigo de Leo Gutiérrez. me sigue dando errores de compilacion :

Código:
	test.cpp: In function 'char* func()':
test.cpp:5:24: error: invalid conversion from 'void*' to 'char*' [-fpermissive]

Utilizando el metodo de avesudra logro compilar el codigo pero la salida no acaba de cuadrar :

Código:
	Introduce word = casa
Result = casa╠■(.

Aunque ahora ya puedo devolver el array la salida devuelve caracteres que no se de donde salen... Alguna idea de como solucionar esto??
Muchas gracias por vuestra ayuda!!


Título: Re: Funcion que retorne char array?
Publicado por: juancaa en 19 Julio 2012, 03:30 am
rir3760 tienes toda la razon en eso, la verdad es que vengo de C y no se notar muy bien la diferencia entre C y C++... Esta pregunta la verdad me ha matado! Normalmente la unica diferencia que veo entre los codigos que utilizan C y los que utilizan C++ es que utilizan otro formato de entrada/salida (el namespace std) pero como todavia no estoy habituado pues no lo uso y al ver que el compilador tragaba pues yo seguia (no me maten por esto  :-X :-X).
Sea como sea, si estubiese usando C++ creo que deberia seguir pasando el array como puntero asi que la diferencia deberia ser minima por no decir nula, o me equivoco nuevamente ?


Título: Re: Funcion que retorne char array?
Publicado por: rir3760 en 19 Julio 2012, 03:44 am
Si estas aprendiendo C++ deberías utilizar las facilidades que este provee como es la clase string. Si no tienes una referencia de calidad puedes utilizar la del sitio (en ingles) C plus plus.

Un ejemplo sencillo (para el caso demasiado largo) es:
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <string>
  6. using std::string;
  7.  
  8. string fn(char texto[]);
  9.  
  10. int main()
  11. {
  12. string s;
  13.  
  14. s = fn("Esta es una cadena de prueba");
  15. cout << s << endl;
  16.  
  17. return 0;
  18. }
  19.  
  20. string fn(char texto[])
  21. {
  22. string s(texto);
  23.  
  24. return s;
  25. }

Un saludo


Título: Re: Funcion que retorne char array?
Publicado por: KaL3o en 19 Julio 2012, 03:46 am
Lo q esta ocurriendo es que cuando mandas parametros por referencia tratandose de arrays, lo que haces es trabajar directamente con el array.

El problema aqui es q el vector esta declarado dentro de un ambito (en este caso una funcion), al terminar el ambito lo que tiene adentro se destruye o se llena de basura.

Por eso cuando devuelves la cadena por referencia (una direccion de memoria) a tu funcion main te aparece algo totalmente diferente.

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Título: Re: Funcion que retorne char array?
Publicado por: leogtz en 19 Julio 2012, 07:13 am
Gracias por vuestras respuestas!
Respecto al codigo de Leo Gutiérrez. me sigue dando errores de compilacion :

Código:
	test.cpp: In function 'char* func()':
test.cpp:5:24: error: invalid conversion from 'void*' to 'char*' [-fpermissive]

Utilizando el metodo de avesudra logro compilar el codigo pero la salida no acaba de cuadrar :

Código:
	Introduce word = casa
Result = casa╠■(.

Aunque ahora ya puedo devolver el array la salida devuelve caracteres que no se de donde salen... Alguna idea de como solucionar esto??
Muchas gracias por vuestra ayuda!!

A mi código agregale un (char *) antes del malloc, algo así:

(char *)malloc(....)

El compilador no debería de pedirlo, es extraño.


Título: Re: Funcion que retorne char array?
Publicado por: DickGumshoe en 19 Julio 2012, 09:43 am
Citar
A mi código agregale un (char *) antes del malloc, algo así:

(char *)malloc(....)

El compilador no debería de pedirlo, es extraño.

A mí siempre me ha pedido el (char*) antes de usar malloc(). Creo (o supongo, no lo sé seguro) que es para que el compilador sepa si lo que quieres que tenga 20 elementos es el vector, o en el caso de las matrices; si hay 20 columnas o 20 filas.

Por otra parte, yo siempre he usado:

Código
  1. variable = (char *) malloc (20 * sizeof(char));

Creo que es necesario poner también el sizeof(char) para que sepa que tiene que reservar el espacio de 20 char, al menos así lo vi yo por los libros a partir de los que aprendí C.

Saludos!


Título: Re: Funcion que retorne char array?
Publicado por: do-while en 19 Julio 2012, 14:58 pm
¡Buenas!

Ya te han dado varias soluciones, voy a intentar darte una explicacion de porque no funcionaba tu codigo.

No se si sabes lo que es la pila de un programa. Es una parte de la memoria en la que se van acumulando datos de llamadas a funciones, alli se ponen, entre otras cosas, los parametros que pasas a las funciones y el valor de retorno. Una vez que se sale de la funcion, se "recupera" la memoria que se ha utilizado, incluida la que utilizan las variables locales, por lo tanto, como ya han dicho en alguno de las respuestas, los valores que contienen se pueden perder. Esto quiere decir que si devuelves un puntero a una variable que se encuentre dentro de una funcion, lo que estas devolviendo, en principio, es un puntero a alguna parte de la pila, que esta modificandose de forma continua. De ahi la "basura" que encuentras.

Tienes varias formas de solucionar el problema (que yo sepa 4 evidentes... ¿Alguien da mas?), dos muy parecidas, una de ellas ya te la han dado.

Puedes asignar memoria a un puntero local, esto no se perdera, ya que estaras devolviendo un valor a una posicion de memoria no de la pila, sino del heap.

Otra opcion es pasar a la funcion una cadena desde la funcion llamadora.

Si en principio no sabes cuanto va a ocupar el vector (porque por ejemplo ese dato lo obtienes dentro de la funcion) tambien puedes pasar en la lista de parametros un puntero a un puntero y actuar como en el primer caso, asignando la memoria de forma dinamica.

Y para terminar, puedes declarar la variable dentro de la propia funcion como static, de esta forma, cuando salgas de la funcion te aseguraras de que mantiene la informacion, pero esta cambiara de una llamada a otra, por lo que despues de cada llamada tendras que guardar o procesar inmediatamente el dato para que en posteriores llamadas no pierdas informacion que te pueda interesar.

¡Saludos!


Título: Re: Funcion que retorne char array?
Publicado por: rir3760 en 19 Julio 2012, 16:23 pm
A mí siempre me ha pedido el (char*) antes de usar malloc().
Si compilas como C no debe pedirte la conversión, ella es automática.
Si compilas como C++ la conversión es obligatoria.


Por otra parte, yo siempre he usado:

Código
  1. variable = (char *) malloc (20 * sizeof(char));

Creo que es necesario poner también el sizeof(char) para que sepa que tiene que reservar el espacio de 20 char, al menos así lo vi yo por los libros a partir de los que aprendí C.
No es necesaria esa multiplicación ya que "sizeof(char)" siempre es igual a uno.

Un saludo