| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | variabelt antal argumenter som skal sendes~ Fra : Janus | 
  Dato :  17-05-07 13:18 |  
  |   
            En testfunktion skal kunne kaldes test(1,2,3,4,5) og den skal så kalde sig 
 selv ved test(2,3,4,5) som kalder sig med test(3,4,5) etc.
 Jeg kan imidlertid ikke få det til at fungere som det står nu efter som 
 parameterList er en pointer til argumenterne på stakken og ikke argumenterne 
 selv.
 Det vil sige at i næste kald vil first være sat ok, men de andre argumenter 
 er ikke med. I stedet er en pointer til hvor argumenterne er.
 Den kan jeg så bruge direkte, hvis jeg vil, men så vil jeg skulle lave en 
 funktion der er forskellig alt efter om det er første kald eller de 
 følgende, den skal kunne håndtere, og det dur ikke.
 
 Kort satgt vil jeg kunne tage et variabelt antal argumenter og sende nogle 
 af dem videre i andre funktionskald. Hvordan dælen gør jeg det? Kunne self 
 skrive noget assembler og selv rykke ting af og på stakken, men det kan da 
 ikke være meningen?!?
 
 void test(unsigned int first...)
 
 {
 
 va_list parameterList;
 
 va_start(parameterList,first);
 
 int nextArg = va_arg(parameterList, unsigned int);
 
 test(nextArg,parameterList);
 
 va_end(parameterList);
 
 }
 
 
  
            
             |   |   
            
        
 
            
         
           Mogens Hansen (17-05-2007) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  17-05-07 13:38 |  
  |   
            
 "Janus" <jan@no.mail.no> wrote in message 
 news:464c480a$0$7606$157c6196@dreader2.cybercity.dk...
 
 [8<8<8<]
 > Kort satgt vil jeg kunne tage et variabelt antal argumenter og sende nogle 
 > af dem videre i andre funktionskald. Hvordan dælen gør jeg det?
 
 Hvad med at overføre parametrene som en container eller en range ?
 
 void test(vector<int> const& v)
 {
    if(v.empty())
       return;
 
    //...
    // Do something
    // ...
    test(vector<int>(v.begin()+1, v.end());
 }
 
 eller
 
 void test(int const* begin, int const *end)
 {
    assert(begin);
    assert(end);
    if(begin == end)
       return;
 
    //...
    // Do something
    // ...
    test(begin+1, end);
 }
 
 Jeg har aldrig benyttet variable argument funktioner ret meget (undtaget når 
 jeg brugte printf, og ikke tænkte på det).
 
 -- 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
           Janus (17-05-2007) 
         
	
            | Kommentar Fra : Janus | 
  Dato :  17-05-07 13:50 |  
  |   
            > Hvad med at overføre parametrene som en container eller en range ?
 >
 > void test(vector<int> const& v)
 > {
 >   if(v.empty())
 >      return;
 >
 >   //...
 >   // Do something
 >   // ...
 >   test(vector<int>(v.begin()+1, v.end());
 > }
 
 Fiks syntax for constructor og initialiering af vector. Den kendte jeg ikke 
 lige.
 Jo, det kan man bortset fra at man så ikke kan kalde den yderste test med 
 test(1,2,3) men skal gøre det med test(vector...), ikke sandt?
 
 
 >
 > eller
 >
 > void test(int const* begin, int const *end)
 > {
 >   assert(begin);
 >   assert(end);
 >   if(begin == end)
 >      return;
 >
 >   //...
 >   // Do something
 >   // ...
 >   test(begin+1, end);
 > }
 
 Den har lidt det samme problem med syntax for yderste funktion. Du har 
 ellers ret i at de klarer opgaven glimrende.
 
 
 
  
            
             |   |   
            
        
 
            
         
            Mogens Hansen (17-05-2007) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  17-05-07 14:16 |  
  |   
            
"Janus" <jan@no.mail.no> wrote in message 
 news:464c4f85$0$21924$157c6196@dreader1.cybercity.dk...
 [8<8<8<]
 > Jo, det kan man bortset fra at man så ikke kan kalde den yderste test med 
 > test(1,2,3) men skal gøre det med test(vector...), ikke sandt?
 Jo - det er rigtigt.
 Er det et krav ?
 Du kan formodentlig bruge en variabel argument funktion til at lave 
 vectoren, eller gøre det via overloading.
 I næste version af C++ vil man kunne skrive test({1,2,3,})
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2215.pdf
men det hjælper ikke så meget lige nu.
 -- 
 Venlig hilsen
 Mogens Hansen 
            
              |   |   
            
        
 
            
         
             Mogens Hansen (17-05-2007) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  17-05-07 14:25 |  
  |   
            
 "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message 
 news:464c55a7$0$21930$157c6196@dreader1.cybercity.dk...
 
 [8<8<8<]
 > Du kan formodentlig bruge en variabel argument funktion
 
 Som ikke er typesikker
 
 > til at lave vectoren, eller gøre det via overloading.
 
 Med overloading mener jeg
    inline void test(int i0)
    {
         vector<int>   v(1);
         v[0] = i0;
         test(v);
    }
 
    inline void test(int i0, int i1)
    {   vector<int>   v(2);
         v[0] = i0;
         v[1] = i1;
         test(v);
    }
 osv.
 Det skalerer ikke "uendeligt", men kun til et forudbestemt antal
 
 -- 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
            Ukendt (17-05-2007) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  17-05-07 14:23 |  
  |   
            
 > Den har lidt det samme problem med syntax for yderste funktion.
 >
 
 Så kunne du jo lave en wrapper til lige netop dette ?
 
 (kopiere argumenterne fra disse varargs ind i en vector som du så bruger når 
 du kalder den rigtige funktion)
 
 tpt 
 
 
  
            
             |   |   
            
        
 
            
         
           Jesper (18-05-2007) 
         
	
            | Kommentar Fra : Jesper | 
  Dato :  18-05-07 16:49 |  
  |  
 
            > Kort satgt vil jeg kunne tage et variabelt antal argumenter og sende 
 > nogle af dem videre i andre funktionskald. Hvordan dælen gør jeg det? 
 > Kunne self skrive noget assembler og selv rykke ting af og på stakken, 
 > men det kan da ikke være meningen?!?
 Er det ikke noget i retningen af dette du skal bruge 
 http://www.cppreference.com/stdother/va_arg.html
Den gør at din funktion kan modtage et variabelt antal parametre.
 int sum( int num, ... )
 {
    int answer = 0;
    va_list argptr;
    va_start( argptr, num );
    for( ; num > 0; num-- )
    {
       answer += va_arg( argptr, int );
    }
    va_end( argptr );
    return( answer );
 }
 int main( void )
 {
    int answer = sum( 4, 4, 3, 2, 1 );
    printf( "The answer is %d\n", answer );
    return( 0 );
 }
            
              |   |   
            
        
 
            
         
           Janus (18-05-2007) 
         
	
            | Kommentar Fra : Janus | 
  Dato :  18-05-07 18:20 |  
  |   
            > int sum( int num, ... )
 > {
 >   int answer = 0;
 >   va_list argptr;
 >   va_start( argptr, num );
 >   for( ; num > 0; num-- )
 >   {
 >      answer += va_arg( argptr, int );
 >   }
 >   va_end( argptr );
 >   return( answer );
 > }
 >
 > int main( void )
 > {
 >   int answer = sum( 4, 4, 3, 2, 1 );
 >   printf( "The answer is %d\n", answer );
 >   return( 0 );
 > }
 
 Taker, men det var den del jeg godt kunne finde ud af. Problemet var mere at 
 få sum til at kunne modtage både argumenter i formen sum(1,2,3,4) og igen 
 med va_listen.
 
 Jeg endte med at følge et råd her inde om at overloade funktionen så jeg 
 havde en udgave der tog en mængde argumenter, og en anden der tog en va_list 
 
 
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |