Arrays y funciones

nestor1991ag
29 de Abril del 2010
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.

Capitan Kirk
29 de Abril del 2010
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,

avatardefuego
29 de Abril del 2010
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;
}
}

Rotnes
29 de Abril del 2010
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.

Capitan Kirk
29 de Abril del 2010
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,