/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
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



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste