Discussion:
devolver un array de caracteres desde una funcion
(demasiado antiguo para responder)
Fernando
2003-11-05 11:57:37 UTC
Permalink
Hola,
lo que quiero es llamar, desde el programa principal, a una funcion (sin
pasarle ningun dato), que se ejecute esa funcion y que me devuelva datos de
tipo caracteres. He generado este programa de pruebas que no me funciona, y
creo que es porque no tengo muy claro los conceptos:
#include <stdio.h>
char composefile(void);
main ()
{
char uno[6];
uno = composefile();
printf("%s", uno);
}

char composefile(void)
{
char KK[]="hola";
return (&KK);
}

me da un error al intentar compilarlo. Alguien me puede decir como se puede
hacer esto.

Gracias,
Fernando
Winfree
2003-11-05 13:06:14 UTC
Permalink
Post by Fernando
Hola,
lo que quiero es llamar, desde el programa principal, a una funcion (sin
pasarle ningun dato), que se ejecute esa funcion y que me devuelva datos de
tipo caracteres. He generado este programa de pruebas que no me funciona, y
Si lo que quieres es crear una cadena en la función composifile lo que
tienes que hacer es pasarle la cadena como dato de entrada/salida. Al
ser una cadana nada más que un vector (puntero) pues por si mismo ya
es un dato de entrada/salida, así que podrias llamar a tu función así

composefile(uno)

y al terminar en uno tendrias la cadena que deseas. Ten en cuenta que
las cadenas siempre acaban con un '\0', así que debes de tenerlo en
cuenta en el tamaño del vector. Para funciones sobre cadenas mira
string.h

Si lo que quieres es no tener parametros en la función pues tendrás
entonces que pelearte con los punteros, pero de la otra forma es mucho
más claro, o por lo menos eso creo yo ;-)
Martin J. Sanchez
2003-11-05 13:25:46 UTC
Permalink
Post by Fernando
Hola,
lo que quiero es llamar, desde el programa principal, a una funcion (sin
pasarle ningun dato), que se ejecute esa funcion y que me devuelva datos de
tipo caracteres. He generado este programa de pruebas que no me
funciona, y
Post by Fernando
#include <stdio.h>
char composefile(void);
main ()
{
char uno[6];
uno = composefile();
printf("%s", uno);
}
char composefile(void)
{
char KK[]="hola";
return (&KK);
}
me da un error al intentar compilarlo. Alguien me puede decir como se puede
hacer esto.
Tienes varios errores de concepto en el codigo, por ejemplo, la funcion
compositefile deveria devolver un 'char*' no un 'char', etc.

Principalmente tienes dos metodos:
1 - devolver un puntero a un array estatico o dinamico (auto no vale)
2 - pasar un buffer (array) a la funcion, donde la funcion dejara el
resultado.

Ejemplo 1 usando un array estatico:

const char* compositefile(void);

int main ()
{
const char *uno;
uno = composefile();
printf("%s", uno);
return 0;
}

const char* composefile(void)
{
estatic char array[MAX_ARRAY];

/* ejemplo de composicion de array: */
sprintf( array, "%s", "hola");

return array;
}

Esta funcion tiene varios inconvenientes:
a - No es reentrante (threads)
b - Si vas a manipular el array devuelto, es inseguro por que
la funcion cliente desconoce el tamaño del array (por eso
lo declaramos "const char*")
c - Se utiliza el mismo array para distintas llamadas
a compositefile.

Ejemplo 2 usando un array dinamico:
const char* composefile(void)
{
char *array;

array = malloc( MAX_ARRAY );
if(array) {
/* ejemplo de composicion de array: */
sprintf( array, "%s", "hola");
}

return array;
}

Esta solucion solventa los inconvenientes (c) y (a) aunque este ultimo
dependera de si malloc es reentrante. El problema añadido es que el
valor devuelto lo tendras que liberar con free(), lo cual se puede
olvidar.

Ejemplo 3 pasando un buffer a la funcion:

char* compositefile( char* buffer, int sizbuffer)
{
if( !buffer || sizbuffer<=0 )
return 0;

strncpy(buffer, "hola", sizbuffer);
buffer[sizbuffer-1]='\0';
return buffer;
}

Ahora podrias usarlo asi:
int main ()
{
char uno[MAX_BUF];
composefile(uno, sizeof(uno));
printf("%s", uno);
return 0;
}
o asi:
int main ()
{
char uno[MAX_BUF];
printf("%s", composefile(uno, sizeof(uno)));
return 0;
}

Esto soluciona todos los problemas anteriormente descritos.

Un saludo,
Martin.
Fernando
2003-11-06 10:28:01 UTC
Permalink
Gracias por la respuesta, he modificado mi programa segun las indicaciones y
ya funciona.

Fernando
Post by Fernando
Post by Fernando
Hola,
lo que quiero es llamar, desde el programa principal, a una funcion
(sin
Post by Fernando
pasarle ningun dato), que se ejecute esa funcion y que me devuelva
datos de
Post by Fernando
tipo caracteres. He generado este programa de pruebas que no me
funciona, y
Post by Fernando
#include <stdio.h>
char composefile(void);
main ()
{
char uno[6];
uno = composefile();
printf("%s", uno);
}
char composefile(void)
{
char KK[]="hola";
return (&KK);
}
me da un error al intentar compilarlo. Alguien me puede decir como se
puede
Post by Fernando
hacer esto.
Tienes varios errores de concepto en el codigo, por ejemplo, la funcion
compositefile deveria devolver un 'char*' no un 'char', etc.
1 - devolver un puntero a un array estatico o dinamico (auto no vale)
2 - pasar un buffer (array) a la funcion, donde la funcion dejara el
resultado.
const char* compositefile(void);
int main ()
{
const char *uno;
uno = composefile();
printf("%s", uno);
return 0;
}
const char* composefile(void)
{
estatic char array[MAX_ARRAY];
/* ejemplo de composicion de array: */
sprintf( array, "%s", "hola");
return array;
}
a - No es reentrante (threads)
b - Si vas a manipular el array devuelto, es inseguro por que
la funcion cliente desconoce el tamaño del array (por eso
lo declaramos "const char*")
c - Se utiliza el mismo array para distintas llamadas
a compositefile.
const char* composefile(void)
{
char *array;
array = malloc( MAX_ARRAY );
if(array) {
/* ejemplo de composicion de array: */
sprintf( array, "%s", "hola");
}
return array;
}
Esta solucion solventa los inconvenientes (c) y (a) aunque este ultimo
dependera de si malloc es reentrante. El problema añadido es que el
valor devuelto lo tendras que liberar con free(), lo cual se puede
olvidar.
char* compositefile( char* buffer, int sizbuffer)
{
if( !buffer || sizbuffer<=0 )
return 0;
strncpy(buffer, "hola", sizbuffer);
buffer[sizbuffer-1]='\0';
return buffer;
}
int main ()
{
char uno[MAX_BUF];
composefile(uno, sizeof(uno));
printf("%s", uno);
return 0;
}
int main ()
{
char uno[MAX_BUF];
printf("%s", composefile(uno, sizeof(uno)));
return 0;
}
Esto soluciona todos los problemas anteriormente descritos.
Un saludo,
Martin.
erl
2003-11-05 14:23:15 UTC
Permalink
Post by Fernando
Hola,
lo que quiero es llamar, desde el programa principal, a una funcion (sin
pasarle ningun dato), que se ejecute esa funcion y que me devuelva datos de
tipo caracteres. He generado este programa de pruebas que no me funciona, y
Por lo que deduzco de tu explicación, tal vez querías hacer algo así:

#include <stdio.h>

char composefile(void); /* devuelve caracteres dentro de una cadena */

int main() {
char uno;
while ( (uno=composefile()) ) {
printf("%c",uno);
}
printf("\n");

return 0;
}

char composefile(void) {
static char cad[] = "hola";
static int i = 0;

return cad[i++];
}

La función composefile() devuelve caracteres sucesivos dentro de una
cadena en sucesivas llamadas.

Si lo que quieres es devolver la cadena entera, sería algo así:

#include <stdio.h>
char *composefile(void);
main ()
{
char *uno;
uno = composefile();
printf("%s\n", uno);
}

char *composefile(void)
{
static char KK[]="hola"; /* o mem dinamica o global */
return KK;
}
Fernando
2003-11-06 10:28:16 UTC
Permalink
Gracias por la respuesta, he modificado mi programa segun las indicaciones y
ya funciona.

Fernando
Post by Fernando
Post by Fernando
Hola,
lo que quiero es llamar, desde el programa principal, a una funcion (sin
pasarle ningun dato), que se ejecute esa funcion y que me devuelva datos de
tipo caracteres. He generado este programa de pruebas que no me funciona, y
#include <stdio.h>
char composefile(void); /* devuelve caracteres dentro de una cadena */
int main() {
char uno;
while ( (uno=composefile()) ) {
printf("%c",uno);
}
printf("\n");
return 0;
}
char composefile(void) {
static char cad[] = "hola";
static int i = 0;
return cad[i++];
}
La función composefile() devuelve caracteres sucesivos dentro de una
cadena en sucesivas llamadas.
#include <stdio.h>
char *composefile(void);
main ()
{
char *uno;
uno = composefile();
printf("%s\n", uno);
}
char *composefile(void)
{
static char KK[]="hola"; /* o mem dinamica o global */
return KK;
}
Loading...