home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / c / other / learn / vararg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-25  |  1.8 KB  |  60 lines

  1. /* VARARG.C illustrates passing a variable number of arguments using the
  2.  * following macros:
  3.  *      va_start            va_arg              va_end
  4.  *      va_list             va_decl (Unix only)
  5.  */
  6.  
  7. #include <stdio.h>
  8. #define ANSI            /* Comment out for UNIX version     */
  9. #ifdef ANSI             /* ANSI compatible version          */
  10. #include <stdarg.h>
  11. int average( int first, ... );
  12. #else                   /* UNIX compatible version          */
  13. #include <varargs.h>
  14. int average( va_list );
  15. #endif
  16.  
  17. main()
  18. {
  19.     /* Call with 3 integers. Minus -1 is used as terminator.  */
  20.     printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
  21.  
  22.     /* Call with 4 integers. */
  23.     printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
  24.  
  25.     /* Call with just -1 terminator. */
  26.     printf( "Average is: %d\n", average( -1 ) );
  27. }
  28.  
  29. /* Return the average of a variable list of integers. */
  30. #ifdef ANSI             /* ANSI compatible version    */
  31. int average( int first, ... )
  32. {
  33.     int count = 0, sum = 0, i = first;
  34.     va_list marker;
  35.  
  36.     va_start( marker, first );      /* Initialize variable arguments */
  37.     while( i != -1 )
  38.     {
  39.         sum += i;
  40.         count++;
  41.         i = va_arg( marker, int);
  42.     }
  43.     va_end( marker );               /* Reset variable arguments      */
  44.     return( sum ? (sum / count) : 0 );
  45. }
  46. #else       /* UNIX compatible version must use old-style definition */
  47. int average( va_alist )
  48. va_dcl
  49. {
  50.     int i, count, sum;
  51.     va_list marker;
  52.  
  53.     va_start( marker );             /* Initialize variable arguments */
  54.     for( sum = count = 0; (i = va_arg( marker, int)) != -1;  count++ )
  55.         sum += i;
  56.     va_end( marker );               /* Reset variable arguments      */
  57.     return( sum ? (sum / count) : 0 );
  58. }
  59. #endif
  60.