Arrays y funciones
Hola, tengo unas cuantas dudas, dado que la parte de los apuntes que estoy estudiando no la entiendo y falta informaci贸n.
Las dudas son las siguientes:
Para poner un array como parametro de una funcion es:
funcion(vector);
驴y si quiero que me lo devuelva en un array?
x=funcion(vector); //ERROR
La variable x es un vector exactamente igual que el array vector solo que vacio, esperando a que le devulevan informaci贸n en plan array.
Dentro de una funci贸n:
return num[10]; //Estar铆a bien para devolver todo un array?
Eso es todo por ahora, gracias.
Las dudas son las siguientes:
Para poner un array como parametro de una funcion es:
funcion(vector);
驴y si quiero que me lo devuelva en un array?
x=funcion(vector); //ERROR
La variable x es un vector exactamente igual que el array vector solo que vacio, esperando a que le devulevan informaci贸n en plan array.
Dentro de una funci贸n:
return num[10]; //Estar铆a bien para devolver todo un array?
Eso es todo por ahora, gracias.
A ver si puedo aclarar alguna de tus dudas.
En C, el nombre de un array (simplemente el nombre, sin nada m谩s) es un puntero al primer elemento. Por ejemplo:
int a[10]; // Array de 10 enteros
a ser铆a igual a &a[0]
Cuando pasas un array como par谩metro a una funci贸n, lo pasas SIEMPRE por referencia. Siguiendo con el ejemplo de antes, si quiero pasar el array a una funci贸n:
void MiFunc(int *Array);
void MiFunc(int Array[]);
(Puedo declarar el prototipo de la funci贸n de cualquiera de las dos formas).
void MiFunc(int *Array)
{
Array[0] = 1;
//etcetera
}
Ahora bien, no puedo devolver un array desde una funci贸n. En el ejemplo que has puesto,
return num[10]
estar铆a devolviendo el elemento 11 del array (los 铆ndices de arrays en C siempre se numeran comenzando por 0), con lo que al compilar probablemente te encuentres con un error por asignaci贸n entre diferentes tipos.
S铆 que puedes devolver un puntero, ten en cuenta que un puntero puede utilizarse como un array. Pero cuidado. Supongamos
int *DameUnArray(void)
{
int Array[10];
return Array
}
En teor铆a, devuelve un puntero a un array de 10 elementos. Sint谩cticamente, es correcto. Sin embargo, al salir de la funci贸n, el contenido del array Array queda indeterminado. El valor devuelto apunta a una zona de memoria que ya no se utiliza (o que el sistema pasa a emplear para otras cosas), con lo que su modificaci贸n puede provocar desastres. De hecho, las variables locales de una funci贸n se crean en la pila. Si se accede a esa zona (la pila) de manera incorrecta, adi贸s.
Ahora bien, desde una funci贸n s铆 que puedes devolver punteros a zonas de memoria reservadas din谩micamente (con malloc o cualquier funci贸n de su familia). Por ejemplo, sea una funci贸n que crea espacio para un array de estructuras del tama帽o que se le indique:
typedef struct
{
// Composici贸n de la estructura
}
MiEstructura;
MiEstructura *DameArrayEstructuras(int num_elementos);
int main(void)
{
int n;
MiEstructura *ArrayEstructuras;
// Codigo...
n = 100;
MiEstructura = DameArrayEstructuras(n);
// Codigo...
free(ArrayEstructuras);
return 0;
}
MiEstructura *DameArrayEstructuras(int num)
{
MiEstructura *puntero;
puntero = (MiEstructura *)malloc(num * sizeof(MiEstructura));
return puntero;
}
Una vez que retorna de la funci贸n DameArrayEstructuras, puedes utilizar ArrayEstructuras como un array.
Importante: Siempre que reserves memoria con malloc (o alguna de sus parientes), libera la memoria reservada cuando ya no la necesites.
Si tienes alguna otra duda, ya sabes donde estamos. Saludos,
En C, el nombre de un array (simplemente el nombre, sin nada m谩s) es un puntero al primer elemento. Por ejemplo:
int a[10]; // Array de 10 enteros
a ser铆a igual a &a[0]
Cuando pasas un array como par谩metro a una funci贸n, lo pasas SIEMPRE por referencia. Siguiendo con el ejemplo de antes, si quiero pasar el array a una funci贸n:
void MiFunc(int *Array);
void MiFunc(int Array[]);
(Puedo declarar el prototipo de la funci贸n de cualquiera de las dos formas).
void MiFunc(int *Array)
{
Array[0] = 1;
//etcetera
}
Ahora bien, no puedo devolver un array desde una funci贸n. En el ejemplo que has puesto,
return num[10]
estar铆a devolviendo el elemento 11 del array (los 铆ndices de arrays en C siempre se numeran comenzando por 0), con lo que al compilar probablemente te encuentres con un error por asignaci贸n entre diferentes tipos.
S铆 que puedes devolver un puntero, ten en cuenta que un puntero puede utilizarse como un array. Pero cuidado. Supongamos
int *DameUnArray(void)
{
int Array[10];
return Array
}
En teor铆a, devuelve un puntero a un array de 10 elementos. Sint谩cticamente, es correcto. Sin embargo, al salir de la funci贸n, el contenido del array Array queda indeterminado. El valor devuelto apunta a una zona de memoria que ya no se utiliza (o que el sistema pasa a emplear para otras cosas), con lo que su modificaci贸n puede provocar desastres. De hecho, las variables locales de una funci贸n se crean en la pila. Si se accede a esa zona (la pila) de manera incorrecta, adi贸s.
Ahora bien, desde una funci贸n s铆 que puedes devolver punteros a zonas de memoria reservadas din谩micamente (con malloc o cualquier funci贸n de su familia). Por ejemplo, sea una funci贸n que crea espacio para un array de estructuras del tama帽o que se le indique:
typedef struct
{
// Composici贸n de la estructura
}
MiEstructura;
MiEstructura *DameArrayEstructuras(int num_elementos);
int main(void)
{
int n;
MiEstructura *ArrayEstructuras;
// Codigo...
n = 100;
MiEstructura = DameArrayEstructuras(n);
// Codigo...
free(ArrayEstructuras);
return 0;
}
MiEstructura *DameArrayEstructuras(int num)
{
MiEstructura *puntero;
puntero = (MiEstructura *)malloc(num * sizeof(MiEstructura));
return puntero;
}
Una vez que retorna de la funci贸n DameArrayEstructuras, puedes utilizar ArrayEstructuras como un array.
Importante: Siempre que reserves memoria con malloc (o alguna de sus parientes), libera la memoria reservada cuando ya no la necesites.
Si tienes alguna otra duda, ya sabes donde estamos. Saludos,
hola..
respondiendo a la pregunta principal..
no, no se puede devolver todo un array en una funcion,
mas si se podria si esta dentro de una estructura.
en eso estoy de acuerdo con ""Capitan Kirk""
pero.
hay otra forma de recuperar los valores que se asignen al array dentro de una funcion.
para eso estan los punteros o doble punteros.
segun sea en caso.
y se trabajaria en la funcion en base a la direccion del puntero que se envia en la llamada a la funcion.
#include <stdio.h>
#define TOTAL 10
void llenarMatriz( int *matriz );
int main()
{
int mymatriz[TOTAL];
llenarMatriz( (int*)mymatriz );
for ( int i=0; i<TOTAL; i++ )
{
printf( "%dn", mymatriz[i] );
}
getchar();
return 0;
}
void llenarMatriz( int *matriz )
{
for( int i=0; i<TOTAL; i++ )
{
*(matriz+i) = 2*i;
}
}
respondiendo a la pregunta principal..
no, no se puede devolver todo un array en una funcion,
mas si se podria si esta dentro de una estructura.
en eso estoy de acuerdo con ""Capitan Kirk""
pero.
hay otra forma de recuperar los valores que se asignen al array dentro de una funcion.
para eso estan los punteros o doble punteros.
segun sea en caso.
y se trabajaria en la funcion en base a la direccion del puntero que se envia en la llamada a la funcion.
#include <stdio.h>
#define TOTAL 10
void llenarMatriz( int *matriz );
int main()
{
int mymatriz[TOTAL];
llenarMatriz( (int*)mymatriz );
for ( int i=0; i<TOTAL; i++ )
{
printf( "%dn", mymatriz[i] );
}
getchar();
return 0;
}
void llenarMatriz( int *matriz )
{
for( int i=0; i<TOTAL; i++ )
{
*(matriz+i) = 2*i;
}
}
Ejercicio 28: (Trabajar en casa) Dise帽a un programa que lea n煤meros como cadenas de caracteres, la base en la que est谩 el n煤mero y la base a la que quiere convertir dicho n煤mero. El programa parar谩 al leerse la cadena 聯***聰. Se considerar谩n las bases 2, 8, 10 y 16. Se usar谩 una funci贸n para realizar cada tipo de conversi贸n. El n煤mero convertido se escribir谩 en pantalla desde el programa principal.
No es necesario que hagais nada de codigo, lo que pasa es que simplemente no lo entiendo. Sobre todo cuando dice:
Se considerar谩n las bases 2, 8, 10 y 16. //No tengo ni idea que quiere decir ahi. Yo creia que las bases quiere decir: decimal, binario, caracter, etc.
No es necesario que hagais nada de codigo, lo que pasa es que simplemente no lo entiendo. Sobre todo cuando dice:
Se considerar谩n las bases 2, 8, 10 y 16. //No tengo ni idea que quiere decir ahi. Yo creia que las bases quiere decir: decimal, binario, caracter, etc.
Base 2: Binario
Base 8: Octal (d铆gitos de 0 a 7, el 8 ya ser铆a 10)
Base 10: El sistema decimal que usamos habitualmente.
Base 16: Hexadecimal (d铆gitos de 0 a 9, mas las letras A a F, da igual may煤sculas que min煤sculas).
El ejercicio es un simple cambio de sistemas de numeraci贸n.
Saludos,
Base 8: Octal (d铆gitos de 0 a 7, el 8 ya ser铆a 10)
Base 10: El sistema decimal que usamos habitualmente.
Base 16: Hexadecimal (d铆gitos de 0 a 9, mas las letras A a F, da igual may煤sculas que min煤sculas).
El ejercicio es un simple cambio de sistemas de numeraci贸n.
Saludos,