epelpad

El post que buscas se encuentra eliminado, pero este también te puede interesar

Funciones con número variable de argumentos

Funciones con número variable de argumentos

Apuntes y Monografias

Qué tal de nuevo amigos de Taringa! Hoy vengo a mostrarles como escribir funciones que reciben un número variable de argumentos en C; un buen ejemplo de lo anterior es la función printf.

Programacion

printf y scanf

Las funciones de la biblioteca estándar de C printf y scanf son un buen ejemplo de funciones que reciben un número variable de argumentos. Explicaremos un poco como es que funciona esto en la función printf.

A la función printf siempre se le debe de pasar un argumento (si o si) que es la cadena de formato.

printf( "El resultado de la operación %f entre %d es %f", x, y, z );

La cadena de formato le informa a printf cuantos argumentos extras recibirá y de que tipo es cada uno. En el ejemplo anterior, la función sabe que recibirá 3 argumentos extras, que el primero es float, el segundo integer y el tercero nuevamente float.

ANSI C

stdarg.h

Para la escritura de funciones o procedimientos que reciban un número variable de argumentos necesitaremos incluir el archivo de cabecera stdarg en el cual se encuentran las macros necesarias para la escritura de este tipo de funciones.

  • va_list, un tipo de dato apuntador
  • va_start(), una macro usada para inicializar la lista de argumentos
  • va_arg(), una macro usada para recuperar cada argumento, en turno, de la lista de variables
  • va_end(), una macro usada para limpieza cuando han sido recuperados todos los argumentos

Cuando se declara una función que toma una lista variable de argumentos primero se listan los parámetros fijos, es decir, aquellos que siempre están presentes (debe haber por lo menos un parámetro fijo). Luego se incluyen puntos suspensivos "..." (como si fuera otro parámetro) al final de la lista de parámetros.

Ahora, la función debe de saber cuantos argumentos adicionales debe esperar y de que tipo es cada uno. Para solucionar lo anterior se puede indicar el número de argumentos adicionales a recibir en el primer argumento (el fijo), aunque esto solo nos valdría si todos los argumentos son del mismo tipo. ¿Y qué pasa si los argumentos adicionales pueden ser de distintos tipos? Se puede recurrir a una solución similar a la usada por printf, la cual debe de ser implementada por el programador Funciones con numero variable de argumentos

Ahora veamos como recuperar los argumentos adicionales dentro de la función (para su uso claro esta). Primero se declara una variable de tipo va_list, en el ejemplo (que se encuentra más abajo) se usa como identificador "arg_ptr".

Segundo, se llama a la macro va_start() pasándole como argumentos la variable de tipo va_list y el nombre del último argumento fijo (en el ejemplo 'n').

Tercero, se recupera cada argumento llamando a la macro va_arg() la cual recibe como argumentos el tipo de dato va_list, en nuestro ejemplo "arg_ptr" (que ya apunta al primer argumento adicional), y el tipo de dato a recuperar. Cada vez que se llama a la macro va_arg(), "arg_ptr" termina apuntando al siguiente argumento, por lo cual no hace falta incrementarlo y esto nos permite recuperar los argumentos en el orden listado en la llamada de la función (cuyo nombre en nuestro ejemplo es average). Entonces para recuperar n argumentos hace falta llamar n veces a la macro va_arg().

Cuarto, por último se llama a la macro va_end() pasándole como argumento "arg_ptr"

#include <stdio.h>
#include <stdarg.h>

void average( unsigned int n, ... )
{
    unsigned int i = 0u;
    double sum = 0.0;
    va_list arg_ptr;
    
    va_start( arg_ptr, n );
    
    for( i = 0u; i < n; i++ )
        sum += va_arg( arg_ptr, double );
    
    printf( "The average is %.2lf.n", sum/n );
    
    va_end( arg_ptr );
}

int main( void )
{
    average( 6u, 86.0, 100.0, 84.0, 93.0, 92.0, 83.0 );
    return 0;
}

Funciones con número variable de argumentos

Bueno, hasta aquí el post de hoy, he omitido un par de cosas para no hacer tan largo el post, pero con lo anterior ya puede escribir sus propias funciones que reciban un número variado de argumentos. Espero que les haya gustado la información. ¡Hasta la próxima! Apuntes y Monografias

Programacion

ANSI C

3 comentarios - Funciones con número variable de argumentos

jerauma
¿Que ide/editor usas?
acipriani68
Notepad++ con el tema Monokai.
jerauma
@acipriani68 Debe ser mas dificil, no?
EzeXP
Excelente post! Gracias por el dato no tenia idea!