elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  headers cstdarg (stdarg.h)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: headers cstdarg (stdarg.h)  (Leído 4,133 veces)
Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
headers cstdarg (stdarg.h)
« en: 20 Junio 2011, 22:23 pm »

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


En línea

Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: headers cstdarg (stdarg.h)
« Respuesta #1 en: 21 Junio 2011, 01:13 am »

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
  1. void function(int numParametros, ...)
  2.  

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

Código
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3.  
  4.  
  5. void funcion(int numParametros, ...)
  6. {
  7. va_list list; //variable de tipo va_list
  8.  
  9. va_start(list, numParametros); //iniciamos la lista de parametros y le pasamos el número
  10.  
  11. for (int i = 0; i < numParametros; i++) //recorremos la lista
  12. {
  13. char * buffer = (char*)va_arg(list, char *); //obtenemos los parámetros de izquiera a derecha
  14. puts(buffer); //escribimos
  15. }
  16.  
  17. va_end(list); //limpiamos la lista
  18. }
  19.  
  20. int main(int argc, char * argv[])
  21. {
  22. funcion(3, "hola", "que tal", "esta es una funcion con parametros");
  23. getchar();
  24. return 0;
  25. }
  26.  

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 Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: headers cstdarg (stdarg.h)
« Respuesta #2 en: 21 Junio 2011, 13:53 pm »

Hola y gracias por contestar,

Me quedan algunas dudas y espero que no te moleste que te las pregunte:

Código
  1. for (int i = 0; i < numParametros; i++) //recorremos la lista
  2. {
  3. char * buffer = (char*)va_arg(list, char *); //obtenemos los parámetros de izquiera a derecha
  4. puts(buffer); //escribimos
  5. }

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

Código
  1. (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
En línea

Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: headers cstdarg (stdarg.h)
« Respuesta #3 en: 21 Junio 2011, 14:04 pm »

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
  1. #include <iostream>
  2. #include <stdarg.h>
  3.  
  4. int Sumar(int cantidadNumeros, ...)
  5. {
  6. va_list list;
  7. int result = 0;
  8.  
  9. va_start(list, cantidadNumeros);
  10.  
  11. for (int i = 0; i < cantidadNumeros; i++)
  12. result += va_arg(list, int);
  13.  
  14. va_end(list);
  15.  
  16. return result;
  17. }
  18.  
  19. int main(int argc, char * argv[])
  20. {
  21. int suma = Sumar(5, 2, 3, 7, 14, 29);
  22. std::cout << "La suma da: " << suma << std::endl;
  23.  
  24. std::cin.get();
  25. return 0;
  26. }
  27.  

Saludos.
« Última modificación: 21 Junio 2011, 14:46 pm por Khronos14 » En línea

Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: headers cstdarg (stdarg.h)
« Respuesta #4 en: 21 Junio 2011, 14:23 pm »

Ok me ha quedado todo mas claro,solo me queda una pequeña duda...

¿cuantos argumentos  podra tener?

Código
  1. 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 Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: headers cstdarg (stdarg.h)
« Respuesta #5 en: 21 Junio 2011, 14:31 pm »

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
  1. int suma = Sumar(3, 2, 3, 7, 14, 29);
  2.  

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
  1. int suma = Sumar(2, 2, 3);
  2. suma = Sumar(3, 2, 3, 7);
  3. suma = Sumar(4, 2, 3, 7, 22);
  4. suma = Sumar(7, 2, 3, 7, 14, 29, 1, 44);
  5.  

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 Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: headers cstdarg (stdarg.h)
« Respuesta #6 en: 21 Junio 2011, 14:44 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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,760 Último mensaje 1 Agosto 2009, 03:54 am
por Skeletron
Error con sesion y headers
PHP
Feedeex 2 3,430 Último mensaje 6 Diciembre 2010, 23:50 pm
por Littl3
Eclipse y Headers en C
Programación C/C++
Saberuneko 8 8,355 Último mensaje 27 Diciembre 2010, 08:53 am
por Saberuneko
Archivos y Stdarg
Programación C/C++
Triper0 4 2,414 Último mensaje 3 Agosto 2011, 05:30 am
por Triper0
Duda stdarg.h en C
Programación C/C++
jhonsc 6 3,206 Último mensaje 2 Febrero 2012, 16:30 pm
por jhonsc
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines