Anuncios Google

[Duda][C][Solucionado+Código fuente de ejemplo]Crear función con numero variable de argumentos

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



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

Ejemplo

Como Ateno ya te lo ha explicado todo, yo solo te pongo el ejemplo de sumar un número indeterminado de parámetros.

#include <stdio.h>
#include <stdarg.h>
 
double suma (int numParms,...){
  double total=0;
  va_list lista;
  va_start (lista, numParms);
  int i;
  for (i = 0; i<numParms; i++){
    total += va_arg (lista, double);
  }
  va_end (lista);
  return (total);
}
 
int main (){
  printf ("%f\n", suma (6,1.0,2.0,3.0,4.0,5.0,6.0));
}

EDIT: Lo siento, he llegado tarde. Cuando empecé a escribir el tema aún estaba abierto xD.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de User170294

Se agradece el ejemplo de

Se agradece el ejemplo de todos modos ^^. Saludos joserc87.

Imagen de ateno_3

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!

Imagen de User170294

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.


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.