Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » va_list - ohne "nervigen" festen Parameter

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.02.2007, 18:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
was ich hier an einer Funktion grad sehe - ich habe sowas:


C++:
void function(unsigned int alwaysnull, ...)
{
  va_list args;
  va_start(args, alwaysnull);
  // ...
  va_end(args)
}



kann man sich diesen ersten "festen" Parameter irgendwie sparen?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.02.2007, 12:44 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also das MSDN Beispiel dazu sieht so aus:


C++:
#include <stdio.h>
#define ANSI            /* Comment out for UNIX version     */
#ifdef ANSI             /* ANSI compatible version          */
#include <stdarg.h>
int average( int first, ... );
#else                   /* UNIX compatible version          */
#include <varargs.h>
int average( va_list );
#endif

void main( void )
{
   /* Call with 3 integers (-1 is used as terminator). */
   printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

   /* Call with 4 integers. */
   printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

   /* Call with just -1 terminator. */
   printf( "Average is: %d\n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
#ifdef ANSI             /* ANSI compatible version    */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     /* Initialize variable arguments. */
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}
#else       /* UNIX compatible version must use old-style definition.  */
int average( va_alist )
va_dcl
{
   int i, count, sum;
   va_list marker;

   va_start( marker );            /* Initialize variable arguments. */
   for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )
      sum += i;
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}
#endif


Also unter UNIX scheint es wohl ohne den ersten Parameter zu funktionieren...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.02.2007, 13:10 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja diese "old style" definition ist noch vom vorkriegsunix
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.02.2007, 14:03 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


ka bei mir hats auf jeden Fall lauter Fehler verursacht wenn ich das #define ANSI auskommentiert hab
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.02.2007, 23:50 Uhr
Pablo
Supertux
(Operator)



Zitat von FloSoft:
Hi,
was ich hier an einer Funktion grad sehe - ich habe sowas:


C++:
void function(unsigned int alwaysnull, ...)
{
  va_list args;
  va_start(args, alwaysnull);
  // ...
  va_end(args)
}



kann man sich diesen ersten "festen" Parameter irgendwie sparen?


Ich würde sagen: eigentlich nicht, denn alwaysnull liefert ja die Adresse, wo die Parameter sich befinden.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: