TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Palomino86 en 02 de Noviembre de 2010, 15:31:21

Título: Funciones en C18
Publicado por: Palomino86 en 02 de Noviembre de 2010, 15:31:21
Tengo una duda acerca de las funciones.... :? Es posible que una función te devuelva mas de una variable o valor de "return" al momento de ser invocada :shock:? O que me sugieren para realizar eso?
Título: Re: Funciones en C18
Publicado por: migsantiago en 02 de Noviembre de 2010, 15:37:29
Tengo una duda acerca de las funciones.... :? Es posible que una función te devuelva mas de una variable o valor de "return" al momento de ser invocada :shock:? O que me sugieren para realizar eso?

No, no pueden devolver más de una variable.

Lo que puedes hacer es que la función reciba un apuntador a un arreglo, lo llene con los datos y termine. Luego el que llama la función lee el arreglo y ahí habrán cuantas variables necesites.
Título: Re: Funciones en C18
Publicado por: RICHI777 en 02 de Noviembre de 2010, 17:02:48
Hola, tal cual lo comento el amigo Mig, la cosa seria:

Código: C
  1. void Function( int *Var1, int *Var2, int *Var3 )
  2. {
  3.    *Var1 = 1;
  4.    *Var2 = 2;
  5.    *Var3 = 3;
  6. }
  7.  
  8. void main( void )
  9. {
  10.   int Pepe, Juan, Jose;
  11.  
  12.   Function( &Pepe, &Juan, &Jose );
  13.  
  14. }

Entonces al invoncar a Function los valores Pepe, Juan y Jose quedan en 1,2 y 3 respectavimante. En este caso se paso un puntero a int pero puede ser tambien un puntero a cualquier tipo válido.

Saludos !
Título: Re: Funciones en C18
Publicado por: manwenwe en 02 de Noviembre de 2010, 17:22:35
También puedes definir una función del tipo de alguna estructura que previamente hayas definido, valga la redundancia, y devolver la estructura: vamos, lo que viene a ser devolver un objeto desde un metodo(función) en algún lenguaje POO (C++, Java, etc.).

Si los datos que quieres devolver están "conceptualmente" relacionados, a mi gusto, esta solución es más elegante que la de devolver punteros...

Saludos.
Título: Re: Funciones en C18
Publicado por: Suky en 02 de Noviembre de 2010, 17:27:56
También puedes definir una función del tipo de alguna estructura que previamente hayas definido, valga la redundancia, y devolver la estructura: vamos, lo que viene a ser devolver un objeto desde un metodo(función) en algún lenguaje POO (C++, Java, etc.).

Si los datos que quieres devolver están "conceptualmente" relacionados, a mi gusto, esta solución es más elegante que la de devolver punteros...

Saludos.

Me gusta esa opción, como dice, queda mucho más elegante.  :)
Título: Re: Funciones en C18
Publicado por: manwenwe en 02 de Noviembre de 2010, 18:17:57
Venga ejemplito jejeje:

Código: [Seleccionar]

      typedef struct{

       int año;
       int mes;
       int dia;

      }FECHA_NACIMIENTO;

      FECHA_NACIMIENTO(void ){

       FECHA_NACIMIENTO fecha.

       fecha.año = 1982;
       fecha.mes = 2;
       fecha.dia = 27;

       return fecha;

      }

      void main( void ) {
 
       FECHA_NACIMIENTO miFecha;

       miFecha = Function();
       while(1);
  
       }    

También puedes devolver varias estructuras desde una función pasando punteros de estructura como argumentos de la función (de forma análoga al ejemplo de RICHI777). Pero acuerdate que a los campos (año, mes y dia en este caso) de una estructura pasada por referencia (puntero) debes acceder con "->" en vez de con ".".

Saludos
Título: Re: Funciones en C18
Publicado por: RICHI777 en 02 de Noviembre de 2010, 18:54:35
Hola, es verdad que con estructuras queda mas elegante, mi ejemplo convertido a estructuras:

Código: C
  1. typedef struct
  2. {
  3.   int Var1;
  4.   int Var2;
  5.   int Var3;
  6. } tMyStruct;
  7.  
  8. void Function( tMyStruct *StructSample )
  9. {
  10.    StructSample -> Var1 = 1;
  11.    StructSample -> Var2 = 2;
  12.    StructSample -> Var3 = 3;
  13. }
  14.  
  15. void main( void )
  16. {
  17.   tMyStruct Nombres;
  18.  
  19.   Function( &Nonbres );
  20.  }

Lo único a tener en cuenta es que con estructuras pasadas a función siempre conviene trabajar con punteros, ya que de esta manera no evitamos la copia que realiza el compilador en forma intrinsica que si realiza cuando las pasamos por valor. Como en el ejemplo que cita el amigo manwenwe y aunque parezca trivial ( y en este caso lo es ) el compilador tiene que hacer un memcpy del tamaño de la estructura a la dirección destino.

Saludos !
Título: Re: Funciones en C18
Publicado por: manwenwe en 02 de Noviembre de 2010, 19:00:19
Vamos que como bien dice RICHI777... mejor pasas las estructuras por referencia y así ahorras RAM ;-)

Saludos