headers cstdarg (stdarg.h)

Iniciado por Dark Invader, 20 Junio 2011, 22:23 PM

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

Dark Invader

Bueno estuve buscando algo de informacion de esto,ya que lo vi en un tutorial y bueno me he quedado un poco en blanco  :xD 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

Khronos14

#1
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:

Código (cpp) [Seleccionar]

void function(int numParametros, ...)


Y aquí tienes un pequeño ejemplo que hice:

Código (cpp) [Seleccionar]

#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.

Dark Invader

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?:

(char*)va_arg(list, char *)


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

Khronos14

#3
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í:

Código (cpp) [Seleccionar]

#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.

Dark Invader

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

Khronos14

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  ;D

Si haces:

Código (cpp) [Seleccionar]

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.

Código (cpp) [Seleccionar]

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.

Dark Invader

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