Autor Tema: Funciones en C18  (Leído 2847 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Funciones en C18
« 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?
Lo que no me destruye, me fortalece

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Funciones en C18
« Respuesta #1 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.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funciones en C18
« Respuesta #2 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 !

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Funciones en C18
« Respuesta #3 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.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones en C18
« Respuesta #4 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.  :)
No contesto mensajes privados, las consultas en el foro

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Funciones en C18
« Respuesta #5 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
« Última modificación: 02 de Noviembre de 2010, 18:33:59 por manwenwe »
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funciones en C18
« Respuesta #6 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 !
« Última modificación: 02 de Noviembre de 2010, 18:59:04 por RICHI777 »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Funciones en C18
« Respuesta #7 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
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -


 

anything