Hola a todos.
Verán estaba siguiendo este curso de C para Linux (por cierto está buenísimo) cuando me encontré con el siguiente problema: en uno de los capítulos del curso (éste capítulo en concreto) finaliza dando unas pistas sobre como crear una función con número variable de argumentos y diciendo que en el siguiente capítulo resolvería el problema y daría un ejemplo de como se haría.
Pués bién, resulta que en el siguiente capítulo se olvida de solucionar la cuestión y deja a los lectores sin un ejemplo claro y concreto. Os lo pongo porque yo no he sido capaz de realizar una función tal a partir de las pistas que da. Estaría muy agradecido si algún coder me podría poner un ejemplo claro. Si puede ser que el ejemplo sea una función a la que le pasas argumentos y retorna la suma de todos los argumentos.
Saludos y gracias.
Código fuente de ejemplo:
//Nombre: Función con número variable de argumentos //Autor: THC_Hack #include <stdio.h> #include <stdarg.h> void listar (int numero_de_argumentos, ...); void main (void) { listar (5, 1, 6, 33, 77, 34); } void listar (int n, ...) { va_list lista; int j; int k=1; va_start (lista, n); while (n>0) { j=va_arg(lista, int); printf("%d. %d\n", k, j); k++; n--; } va_end (lista); }
Resultado:
1. 1 2. 6 3. 33 4. 77 5. 34
Ejemplo
Como Ateno ya te lo ha explicado todo, yo solo te pongo el ejemplo de sumar un número indeterminado de parámetros.
EDIT: Lo siento, he llegado tarde. Cuando empecé a escribir el tema aún estaba abierto xD.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Se agradece el ejemplo de
Se agradece el ejemplo de todos modos ^^. Saludos joserc87.
Posible solucion
Como posiblemente ya habrás visto, el prototipo de la funcion printf es "printf(char* format, ...)"
La clave está en estos últimos 3 puntos, que le indica al compilador que se pueden enviar una cantidad indefinida de argumentos y de tipos aleatorios.
Para extraer los argumentos se usan las macros: va_arg, va_start y va_end. Se usa el tipo va_list, que es un puntero.
va_start ( va_list, ptr )
Esta macro aloja en un va_list el puntero donde se encuentra el primer argumento. El puntero debe ser el del argumento anterior a
los 3 puntos, además, estos 3 puntos deben ser el último parametro del prototipo de función. ptr es el parámetro anterior.
va_arg ( va_list, type )
Extrae el siguiente parámetro. Cuando envias los parámetros a una función mediante este método, deben estar organizados, ya que los extrae en el orden en el que se ponen en la llamada a la función. Por ejemplo:
"printf("%d%d%s", dia, mes, saludo)"
Las secuencias de escape ( %d, %s, etc. ) indican a la función que tipo de datos debe sacar en cuanto se lea la secuencia.
Cuando el compilador, compila esto lo que envía es:
1.- Puntero a la cadena de caracteres ( se envía el puntero a la zona de datos del proceso donde está la cadena ).
2.- Variable dia.
3.- Variable mes.
4.- Variable saludo.
type es el tipo de datos que se extraerá, como int, char, long, int*, char*, etc. ( Nota: los compiladores suelen convertir el tipo char en un int, al enviarlo,
para recibirlo, solamente tienes que recibir un int y realizar un cast)
va_end ( va_list )
Finaliza la extracción de argumentos.
Programo en C, C++, C# y ASM ( Sintaxis INTEL y AT&T )
Proyectos:
- UnlockMii 5.0 ----> UnlockMii 5.1: ( EN CONSTRUCCION -> 2% )
- MiiOS ( EN CONSTRUCCION -> 0,01% )
El mejor antivirus ==> Avast!
Ya he conseguido realizar un
Ya he conseguido realizar un codigo fuente de ejemplo totalmente funcional y correcto. Lo pongo en el post para que todo el que veas esta duda y la tenga pueda resolverla. Saludos ateno.