TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PicMinor en 12 de Febrero de 2013, 06:39:17

Título: Parámetros Opcionales
Publicado por: PicMinor en 12 de Febrero de 2013, 06:39:17
¡ Saludos al foro !

Una duda, ¿Se pueden crear funciones en CCS con parámetros opcionales?, es decir, funciones que puedan ser llamadas con uno, dos o ningún parámetro.

a=funcion();
b=funcion(1)
c=funcion(1,2);
Título: Re: Parámetros Opcionales
Publicado por: ppyote en 12 de Febrero de 2013, 07:41:35
Sí, echale un ojo a las librerías que hay dentro de la carpeta drivers del ccs
Título: Re: Parámetros Opcionales
Publicado por: RedPic en 12 de Febrero de 2013, 09:21:35
Sí, echale un ojo a las librerías que hay dentro de la carpeta drivers del ccs

¿Algún ejemplo en concreto? porque nunca he utilizado en CSS funciones con número de parámetros variable  :shock:
Título: Re: Parámetros Opcionales
Publicado por: ppyote en 12 de Febrero de 2013, 09:55:39
Sí, echale un ojo a las librerías que hay dentro de la carpeta drivers del ccs

¿Algún ejemplo en concreto? porque nunca he utilizado en CSS funciones con número de parámetros variable  :shock:

ahora mismo no estoy en casa, pero los ejemplos de las memorias eeprom de la serie 24 o 25 creo que le valdrían
Título: Re: Parámetros Opcionales
Publicado por: MGLSOFT en 12 de Febrero de 2013, 13:18:49
Estan los parametros por defecto (que se cargan si en la llamada no se pasan parametros):

Citar
Default parameters allows a function to have default values if nothing is passed to it when called.

int mygetc(char *c, int n=100){

}

 

This function waits n milliseconds for a character over RS232. If a character is received, it saves it to the pointer c and returns TRUE. If there was a timeout it returns FALSE.

 

//gets a char, waits 100ms for timeout

mygetc(&c);

//gets a char, waits 200ms for a timeout

mygetc(&c, 200);

Y en el caso de multiples parametros variables, esto dice la ayuda...

Citar
The compiler supports a variable number of parameters. This works like the ANSI requirements except that it does not require at least one fixed parameter as ANSI does. The function can be passed any number of variables and any data types. The access functions are VA_START, VA_ARG, and VA_END. To view the number of arguments passed, the NARGS function can be used.

 

/*

stdarg.h holds the macros and va_list data type needed for variable number of parameters.

*/

#include <stdarg.h>

 

 

A function with variable number of parameters requires two things. First, it requires the ellipsis (...), which must be the last parameter of the function. The ellipsis represents the variable argument list. Second, it requires one more variable before the ellipsis (...). Usually you will use this variable as a method for determining how many variables have been pushed onto the ellipsis.

 

Here is a function that calculates and returns the sum of all variables:

int Sum(int count, ...)

{

   //a pointer to the argument list

   va_list al;

   int x, sum=0;

   //start the argument list

   //count is the first variable before the ellipsis

   va_start(al, count);

   while(count--) {

      //get an int from the list

      x = var_arg(al, int);

      sum += x;

   }

   //stop using the list

   va_end(al);

   return(sum);

}

 

 

Some examples of using this new function:

x=Sum(5, 10, 20, 30, 40, 50);

y=Sum(3, a, b, c);
Título: Re: Parámetros Opcionales
Publicado por: Suky en 12 de Febrero de 2013, 15:29:16
Seria sobrecarga de funciones (http://www.zator.com/Cpp/E4_4_1a.htm) que CCS soporta (Es propiedad de C++  :roll: )

Código: C
  1. int mayor(int a, int b);
  2. int mayor(int a, int b, int c);
  3. int mayor(int a, int b, int c, int d);
  4.  
  5. int mayor(int a, int b) {
  6.    if(a > b) return a; else return b;
  7. }
  8.  
  9. int mayor(int a, int b, int c) {
  10.    return mayor(mayor(a, b), c);
  11. }
  12.  
  13. int mayor(int a, int b, int c, int d) {
  14.    return mayor(mayor(a, b), mayor(c, d));
  15. }
  16.  
  17.  
  18. void main()
  19. {
  20.  
  21.    mayor(10, 4);
  22.    mayor(15, 35, 23);
  23.    mayor(10, 12, 12, 18);
  24. }


Saludos!
Título: Re: Parámetros Opcionales
Publicado por: RedPic en 12 de Febrero de 2013, 16:16:36
Seria sobrecarga de funciones (http://www.zator.com/Cpp/E4_4_1a.htm) que CCS soporta (Es propiedad de C++  :roll: )

Si, si. La he utilizado en C Builder pero no sabía que CCS lo permitiese.  :oops:
Título: Re: Parámetros Opcionales
Publicado por: RALF2 en 12 de Febrero de 2013, 21:22:04
ya somos dos   :shock:

Como se aprende en este foro   :mrgreen:
Título: Re: Parámetros Opcionales
Publicado por: PalitroqueZ en 12 de Febrero de 2013, 22:05:30
sobrecarga de funciones en ccs?!!!

¿y que utilidad podría tener si no se puede implementar la herencia?

Título: Re: Parámetros Opcionales
Publicado por: BrunoF en 12 de Febrero de 2013, 22:10:15
sobrecarga de funciones en ccs?!!!

¿y que utilidad podría tener si no se puede implementar la herencia?



Es un muy buen punto. Pues no más que eso. Y el problema más importante y que lo hace poco útil es que no es un lenguaje orientado a objetos, por lo que no puedes dinámicamente sobrecargarla. Y de paso, la sobrecarga de funciones es una característica muy común en Lenguajes Orientados a Objetos, no sólo en C++.
Título: Re: Parámetros Opcionales
Publicado por: PalitroqueZ en 12 de Febrero de 2013, 22:12:11
a menos que el compilador (que no se como lo haría) adivine cuales lineas de código necesite usar dentro de esa misma función con diferentes parámetros, yo vería mas factible (en tamaño del código) reescribir la función.
Título: Re: Parámetros Opcionales
Publicado por: PicMinor en 18 de Febrero de 2013, 09:53:06
¡ Gracias por las respuestas !

Utilizando la sobrecarga de funciones me ha funcionado como yo quería. Me queda la duda de asignar valores por defecto a los parámetros que no hemos pasado a la/las funciones. Lo he resuelto de una manera un poco cutre llamando desde una función a la otra con valores por defecto. Funcionar funciona pero no se si hay alguna manera más elegante. Lo que he hecho es:

int funcion(a,b);                                            // Función con dos parámetros
int funcion(a,b,c);                                          // Sobrecarga con tres parámetros

int funcion(a,b) {                                           // Llamada con dos parámetros
      return funcion(a, b, ValDefecto_c);            // Llama a la de tres con un valor por defecto para c
}


Gracias a todos!