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


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


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

Desconectado Desconectado

Mensajes: 43


Ver Perfil
Duda stdarg.h en C
« en: 31 Enero 2012, 16:32 »

Buenas (de nuevo). Estoy intentando que un programa me coja unos argumentos fijos y luego, me pueda recoger un número indefinido de argumentos. He oído que sería:
Código
  1. #include <stdarg.h>
  2. int printf(char *text, char *color, ...) //Esto es lo que he oído.
  3. {
  4. /*
  5. Aquí iría lo que no tengo ni idea. Si no pongo la de color consigo que me  coja la variable
  6. texto, pero las "no obligatorias" me las deforma. Son unos int. Por ejemplo, pongo 32 y
  7. me sale 1034..., en fín, que se equivoca. Si pongo la de color... ni se ejecuta.
  8. */
  9. return 0;
  10. }
  11.  
Siento no ponerles el código completo, pero no tengo acceso a él en este momento.


« Última modificación: 31 Enero 2012, 20:58 por jhonsc » En línea

“Vive rápido, muere joven y deja un bonito cadáver”
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda stdarg.h en C
« Respuesta #1 en: 31 Enero 2012, 16:56 »

En C estándar no puedes definir la función principal de esa forma, debe ser "int main(int argc, char **argv) ...", "int main(void) ..." o equivalentes.

Mejor explica de una forma clara lo que debes hacer. Supongo es procesar los argumentos pasados a tu programa mediante la linea de comandos o bien crear un programa con una función (similar a printf/scanf) que reciba un numero variable de argumentos.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
jhonsc

Desconectado Desconectado

Mensajes: 43


Ver Perfil
Re: Duda stdarg.h en C
« Respuesta #2 en: 31 Enero 2012, 20:56 »

Hola, lo que quiero hacer es un mini kernel. Me funciona y todo (al nivel que escribe algo y punto). En la función printf necesito que me recoja, el texto, el color, y las variables. Por ejemplo, la llamaría así:
Código
  1. int c=32; printf("Intento patético de kernel.\nLa variable c es %d\n","red",c);
Ya tengo el printf pero o solo consigo elegir color, o solo coger variables. Cuando intento los dos a la vez, ERROR.
Si sirve de algo, este es mi stdarg.h :
Código
  1. #ifndef _STDARG_H
  2. #define _STDARG_H
  3.  
  4. typedef char *va_list;
  5. #define __va_rounded_size(TYPE)  \
  6.   (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
  7.  
  8. #ifndef __sparc__
  9. #define va_start(AP, LASTARG) \
  10.  (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
  11. #else
  12. #define va_start(AP, LASTARG) \
  13.  (__builtin_saveregs (), \
  14.   AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
  15. #endif
  16.  
  17. void va_end (va_list);
  18. #define va_end(AP)
  19.  
  20. #define va_arg(AP, TYPE) \
  21.  (AP += __va_rounded_size (TYPE), \
  22.   *((TYPE *) (AP - __va_rounded_size (TYPE))))
  23.  
  24. #endif /* _STDARG_H */
  25.  
Y el printf tendría esta forma (solo es parte):
Código
  1. int printf(char *text, char *color, ...)
  2.  
Ah y me equivoqué antes y puse "main" en vez de "printf", lo siento, pero ya dije que no tenía el código y me lié escribiendolo.
« Última modificación: 31 Enero 2012, 21:02 por jhonsc » En línea

“Vive rápido, muere joven y deja un bonito cadáver”
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda stdarg.h en C
« Respuesta #3 en: 1 Febrero 2012, 02:38 »

No es necesario publicar el contenido del encabezado, en su lugar es mejor revisar un buen libro.

Un programa sencillo de ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4.  
  5. void fn(char const *texto, int num_args, ...);
  6.  
  7. int main(void)
  8. {
  9.   fn("Un argumento sin nombre", 1, 1);
  10.   fn("Dos argumentos sin nombre", 2, 1, 2);
  11.   fn("Tres argumentos sin nombre", 3, 1, 2, 3);
  12.  
  13.   return EXIT_SUCCESS;
  14. }
  15.  
  16. void fn(char const *texto, int num_args, ...)
  17. {
  18.   int i;
  19.   va_list lista; /* 1 */
  20.  
  21.   va_start(lista, num_args); /* 2 */
  22.  
  23.   printf("%s:", texto);
  24.  
  25.   for (i = 0; i < num_args; i++)
  26.      printf(" %d", va_arg(lista, int) /* 3 */);
  27.   putchar('\n');
  28.  
  29.   va_end(lista); /* 4 */
  30. }

Los pasos son:

1) Declaras un objeto de tipo "va_list".

2) Ejecutas la macro "va_start" indicando el objeto declarado en el paso 1 y el ultimo parámetro con nombre (en este caso "num_args").

3) Cada vez que debas procesar uno los argumentos utilizas la macro "va_arg" indicando el objeto declarado en el paso 1 y el tipo del objeto esperado (en nuestro caso siempre es de tipo "signed int").

4) Una vez que termines de procesarlos ejecutas la macro "va_end".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
jhonsc

Desconectado Desconectado

Mensajes: 43


Ver Perfil
Re: Duda stdarg.h en C
« Respuesta #4 en: 1 Febrero 2012, 18:17 »

Muchas gracias. Pero como puedo pasar caracteres en vez de números, por ejemplo:
Código
  1. fn('a','b','c');
?¿?¿
« Última modificación: 1 Febrero 2012, 18:33 por jhonsc » En línea

“Vive rápido, muere joven y deja un bonito cadáver”
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda stdarg.h en C
« Respuesta #5 en: 2 Febrero 2012, 03:37 »

Un consejo: si todavía no manejas con soltura el lenguaje C deberías dejar eso para después.

Un problema con el ejemplo que pones es: ¿Como sabrá la función cuantos argumentos se pasaran en la llamada? La función printf se basa en la cadena de formato y el ejemplo que presente en mi mensaje anterior utiliza el ultimo argumento con nombre pero en tu ejemplo falta ese mecanismo.

Por ultimo los caracteres literales no deben darte problemas ya que son enteros de tipo "signed int", mi ejemplo anterior con algunas modificaciones te puede servir de base.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
jhonsc

Desconectado Desconectado

Mensajes: 43


Ver Perfil
Re: Duda stdarg.h en C
« Respuesta #6 en: 2 Febrero 2012, 16:30 »

Ok! ya lo consegui! Gracias!!! Y eso.... soy demasiado impaciente, quiero aprender mucho, pero tengo poco tiempo xD. Gracias de nuevo.
En línea

“Vive rápido, muere joven y deja un bonito cadáver”
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 7,537 Último mensaje 13 Febrero 2008, 21:41
por revenge1252
headers cstdarg (stdarg.h)
Programación C/C++
Dark Invader 6 3,005 Último mensaje 21 Junio 2011, 14:44
por Dark Invader
Archivos y Stdarg
Programación C/C++
Triper0 4 1,450 Último mensaje 3 Agosto 2011, 05:30
por Triper0
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines