Autor
|
Tema: headers cstdarg (stdarg.h) (Leído 4,439 veces)
|
Dark Invader
Desconectado
Mensajes: 111
Lucha hasta el final para conseguir tu objetivo.
|
Bueno estuve buscando algo de informacion de esto,ya que lo vi en un tutorial y bueno me he quedado un poco en blanco No se ni para que sirve ni nada por el estilo, Serian el va-list,va_start y va_end pero es que no tengo ni idea de para que utilizarlos.Si alguien me lo pudiera explicar y con algun que otro ejemplo sencillo se lo agradeceria. Gracias adelantadas. Salu2
|
|
|
En línea
|
|
|
|
Khronos14
Desconectado
Mensajes: 443
A lie is a lie
|
En google hay un montón de información sobre eso. Básicamente sirve para crear funciones que no tienen un número de parámetros fijos. El ejemplo más claro es la función printf. Para declarar una función con un número de parámetros variable, hay que usar los 3 puntos: void function(int numParametros, ...)
Y aquí tienes un pequeño ejemplo que hice: #include <stdio.h> #include <stdarg.h> void funcion(int numParametros, ...) { va_list list; //variable de tipo va_list va_start(list, numParametros); //iniciamos la lista de parametros y le pasamos el número for (int i = 0; i < numParametros; i++) //recorremos la lista { char * buffer = (char*)va_arg(list, char *); //obtenemos los parámetros de izquiera a derecha puts(buffer); //escribimos } va_end(list); //limpiamos la lista } int main(int argc, char * argv[]) { funcion(3, "hola", "que tal", "esta es una funcion con parametros"); getchar(); return 0; }
Si te fijas, a la función va_arg le especifico que quiero obtener un parámetro de tipo char*, puedes especificar otros como int, double, etc.. La función printf para obtener el número de parámetros lo que hace es contar el número de % que se le pasa en la primera cadena y según la letra que le preceda obtiene de la lista un int, double, char*. En esta función de ejemplo, necesitamos especificar cuantos parámetros le pasamos. http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/Saludos.
|
|
« Última modificación: 21 Junio 2011, 14:46 pm por Khronos14 »
|
En línea
|
|
|
|
Dark Invader
Desconectado
Mensajes: 111
Lucha hasta el final para conseguir tu objetivo.
|
Hola y gracias por contestar, Me quedan algunas dudas y espero que no te moleste que te las pregunte: for (int i = 0; i < numParametros; i++) //recorremos la lista { char * buffer = (char*)va_arg(list , char *); //obtenemos los parámetros de izquiera a derecha puts(buffer ); //escribimos }
¿Hace falta guardarlo todo en un puntero char? Porque si por ejemplo lo opngo a un puntero int esta linea no seria la misma no?:
Y en esta linea: funcion(3, "hola", "que tal", "esta es una funcion con parametros"); El 3 al parecer es el numero de parametros,pero podrian haber sido numeros en vez de palabras ¿no? Gracias por aclararme la duda. Salu2
|
|
|
En línea
|
|
|
|
Khronos14
Desconectado
Mensajes: 443
A lie is a lie
|
Hola Dark Invader, pues como ya te dije en la función va_arg, en el segundo parámetro le indicas el tipo de dato que quieres obtener. En el ejemplo que te puse, quiero obtener 3 punteros de tipo char. Si quieres obtener int, harías algo así: #include <iostream> #include <stdarg.h> int Sumar(int cantidadNumeros, ...) { va_list list; int result = 0; va_start(list, cantidadNumeros); for (int i = 0; i < cantidadNumeros; i++) result += va_arg(list, int); va_end(list); return result; } int main(int argc, char * argv[]) { int suma = Sumar(5, 2, 3, 7, 14, 29); std::cout << "La suma da: " << suma << std::endl; std::cin.get(); return 0; }
Saludos.
|
|
« Última modificación: 21 Junio 2011, 14:46 pm por Khronos14 »
|
En línea
|
|
|
|
Dark Invader
Desconectado
Mensajes: 111
Lucha hasta el final para conseguir tu objetivo.
|
Ok me ha quedado todo mas claro,solo me queda una pequeña duda... ¿cuantos argumentos podra tener? int suma = Sumar(5, 2, 3, 7, 14, 29);
Por ejemplo esto haria que tuviera 5 valores int,pero pueden ser varios valores?¿para que se pueden utilizar este tipo de "macros"? Salu2 y gracias de nuevo
|
|
|
En línea
|
|
|
|
Khronos14
Desconectado
Mensajes: 443
A lie is a lie
|
El número de argumentos máximos depende de va_start, que se le pasa un valor de tipo int, por lo tanto debería permitir 4294967296 parámetros. Pero, la verdad, no creo que aguante tantos parámetros ni te recomendaría que lo comprobaras Si haces: int suma = Sumar(3, 2, 3, 7, 14, 29);
Si al primer parámetro le pasas un 3, así que va a ignorar los 2 últimos números, la suma daría 12. int suma = Sumar(2, 2, 3); suma = Sumar(3, 2, 3, 7); suma = Sumar(4, 2, 3, 7, 22); suma = Sumar(7, 2, 3, 7, 14, 29, 1, 44);
Suelen ser bastante útiles estas funciones, un ejemplo claro son las funciones: printf, fprintf, sprintf.. El uso que le des a esto, depende de tu imaginación a la hora de programar. Saludos.
|
|
|
En línea
|
|
|
|
Dark Invader
Desconectado
Mensajes: 111
Lucha hasta el final para conseguir tu objetivo.
|
Gracias Khronos14 me has ayudado mucho y gracias a ti he aprendido cosas nuevas De momento haré más ejercicios sobre esto para dominarlo. De nuevo muchas gracias. Salu2
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como son los HEADERS de las imagenes jpg y bmp?
Diseño Gráfico
|
Skeletron
|
1
|
4,908
|
1 Agosto 2009, 03:54 am
por Skeletron
|
|
|
Error con sesion y headers
PHP
|
Feedeex
|
2
|
3,552
|
6 Diciembre 2010, 23:50 pm
por Littl3
|
|
|
Eclipse y Headers en C
Programación C/C++
|
Saberuneko
|
8
|
8,686
|
27 Diciembre 2010, 08:53 am
por Saberuneko
|
|
|
Archivos y Stdarg
Programación C/C++
|
Triper0
|
4
|
2,603
|
3 Agosto 2011, 05:30 am
por Triper0
|
|
|
Duda stdarg.h en C
Programación C/C++
|
jhonsc
|
6
|
3,492
|
2 Febrero 2012, 16:30 pm
por jhonsc
|
|