TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Nocturno en 21 de Marzo de 2008, 04:40:38

Título: Función con número de argumentos variable
Publicado por: Nocturno en 21 de Marzo de 2008, 04:40:38
¿Cómo se define en lenguaje C una función cuyo número de argumentos sea variable, con un mínimo de 1?

Lo que quiero hacer es algo parecido al printf, que lo mismo le da esto:

printf("hola");

que esto otro:
printf ("%u %u %u %u",1,2,3,4);
Título: Re: Función con número de argumentos variable
Publicado por: jfmateos2 en 21 de Marzo de 2008, 06:19:17
Podrías utilizar sobrecarga de funciones, pero la única información que encuentro en CCS al respecto es ésta: http://www.ccsinfo.com/content.php?page=functionovr
Título: Re: Función con número de argumentos variable
Publicado por: Nocturno en 21 de Marzo de 2008, 06:24:54
Concretamente lo necesito para C30, pero supongo que será igual.
Sobrecarga de funciones  :? , me va a salir un programa enorme...
Título: Re: Función con número de argumentos variable
Publicado por: jfh900 en 21 de Marzo de 2008, 06:32:33
Me da la impresión Manolo que estos compiladores no lo van a soportar. Pero de todas formas aquí tienes la explicación de como hacerlo:

http://www.elrincondelprogramador.com/default.asp?pag=articulos/leer.asp&id=54

Un saludo y cuéntanos tus logros .

Título: Re: Función con número de argumentos variable
Publicado por: jfmateos2 en 21 de Marzo de 2008, 06:33:48
Pues me temo que, según esta tabla http://www.ccsinfo.com/content.php?page=newcompilercomp, C30 no admite "Function overloading"

También puedes usar el truco de utilizar como argumento una cadena de longitud variable y, discernir, dentro de ella cada parámetro.
Título: Re: Función con número de argumentos variable
Publicado por: maunix en 21 de Marzo de 2008, 08:02:12
Sobrecarga de funciones  :? , me va a salir un programa enorme...

Jeje, ahora sabes porqué printf genera tanto código.  :mrgreen:

Ahora bien, yendo al grano, me puse a ver el código fuente del printf en el C18 y te muestra como es el prototipo de la función.

Código: C
  1. #include <stdio.h>
  2.  
  3. /* printf() is a wrapper function which calls vfprintf() with stdout as the
  4.    destination output stream. EOF is returned on error, else the number
  5.    of characters output. */
  6. int
  7. printf (const rom char *fmt, ...)
  8. {
  9.   va_list ap;
  10.   int n;
  11.   va_start (ap, fmt);
  12.   n = vfprintf (stdout, fmt, ap);
  13.   va_end (ap);
  14.   return n;
  15. }

Los ... se usan para decirle al C que la cantidad de argumentos es variable.

Te dejo el siguiente link que explica brevemente de que trata

http://www.ericgiguere.com/articles/ansi-c-summary.html

Ve a la sección Variable Parameter Lists

Saludos
Título: Re: Función con número de argumentos variable
Publicado por: Nocturno en 21 de Marzo de 2008, 08:06:29
¿Dónde se encuentra el fuente del printf?

Lo voy a probar ahora mismo en C30. Gracias Mauricio.

Título: Re: Función con número de argumentos variable
Publicado por: jfh900 en 21 de Marzo de 2008, 08:09:22
Manolo, prueba esta función que permite un número variable de parámetros:

Código: [Seleccionar]
double multiSuma(int operandos, ...) {

    double resultado = 0.0;
    va_list pa;

    va_start(pa, operandos);

    while (operandos--) {
        resultado += va_arg(pa, double);
    }

    va_end(pa);

    return resultado;
}

No te olvides de incluir stdio.h

Un saludo
Título: Re: Función con número de argumentos variable
Publicado por: Nocturno en 21 de Marzo de 2008, 13:09:33
Pues lo he intentado pero no lo consigo. He incluido esta función en mi programa:
Código: C
  1. void xprintf (char *fmt, ...) {
  2.         va_list ap;  
  3.         int n;  
  4.         va_start(ap, fmt);  
  5.         printf (fmt, ap);
  6.         va_end(ap);
  7. }
   

y me tira este error:
Código: DOS
  1. principal.c:209: undefined reference to `va_start'
  2. principal.o(.text+0x912):principal.c:211: undefined reference to `va_end'

Es curioso, porque no se queja de los puntos suspensivos ni de la clase va_list  :?
Título: Re: Función con número de argumentos variable
Publicado por: maunix en 22 de Marzo de 2008, 18:04:10
¿Dónde se encuentra el fuente del printf?


Manolo, en el C18 están en la carpeta src que es un subdirectorio de mcc18

En cuanto a que te de error, la verdad no me he puesto a ver pero el include al stdio.h hará que se linkee la librería stdio.lib es probable (seguro en realidad) que estén definida ahí los tipos de datos así como las funciones y/o macros respectivos

Tal vez en C30 estén en otro lugar, por eso no se debiera copiar literal el código.

Lo de los ... lo permite sin chistar porque es ANSI C.  :)
Título: Re: Función con número de argumentos variable
Publicado por: Nocturno en 23 de Marzo de 2008, 03:09:10
Tirando del hilo he averiguado que si pongo esto #include <stdarg.h> el programa compila.
De todas formas, no consigo que funcione...
Título: Re: Función con número de argumentos variable
Publicado por: jfh900 en 23 de Marzo de 2008, 08:27:44
No te puede funcionar, ya que no recorres la lista de argumentos.

Un saludo
Título: Re: Función con número de argumentos variable
Publicado por: Nocturno en 23 de Marzo de 2008, 14:30:48
No la recorro, pero tampoco sé cómo hacerlo para utilizar el printf como el ejemplo que puso Maunix unos posts atrás  :?
Título: Re: Función con número de argumentos variable
Publicado por: jfh900 en 23 de Marzo de 2008, 15:12:01
En el enlace que te pase en el post:

http://www.todopic.com.ar/foros/index.php?topic=20969.msg160630#msg160630

Esta explicado y trae un ejemplo para simular un printf.

Un saludo
Título: Re: Función con número de argumentos variable
Publicado por: Sispic en 23 de Marzo de 2008, 15:45:52
Asi creo que cuela .

char SALIDA;
#define printf_LCD      SALIDA=LCD;    printf
#define printf_USART  SALIDA=USART; printf
#define LCD     1
#define USART 2

y poner el switch correspondiente en la funcion ....
int write(int handle,  void *buffer){
switch(SALIDA) {


ejemplos:
printf_LCD("Feliz Navidad al lcd %u %u \n" , f++ , TMR1);
printf_USART("Feliz Navidad al usart %u %u \n" , f++ , TMR1);


Título: Re: Función con número de argumentos variable
Publicado por: jfh900 en 23 de Marzo de 2008, 17:21:23
Pues resulta que el CCS si lo soporta. Esta definido el fichero stdarg.h con las funciones necesarias para definir las funciones con parámetros variables.

Un saludo