Autor Tema: Función con número de argumentos variable  (Leído 4016 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Función con número de argumentos variable
« 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);

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Función con número de argumentos variable
« Respuesta #1 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Función con número de argumentos variable
« Respuesta #2 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...

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Función con número de argumentos variable
« Respuesta #3 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 .

* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Función con número de argumentos variable
« Respuesta #4 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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Función con número de argumentos variable
« Respuesta #5 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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Función con número de argumentos variable
« Respuesta #6 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.


Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Función con número de argumentos variable
« Respuesta #7 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Función con número de argumentos variable
« Respuesta #8 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  :?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Función con número de argumentos variable
« Respuesta #9 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.  :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Función con número de argumentos variable
« Respuesta #10 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...

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Función con número de argumentos variable
« Respuesta #11 en: 23 de Marzo de 2008, 08:27:44 »
No te puede funcionar, ya que no recorres la lista de argumentos.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Función con número de argumentos variable
« Respuesta #12 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  :?

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Función con número de argumentos variable
« Respuesta #13 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: Función con número de argumentos variable
« Respuesta #14 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);