Forum: Compiler & IDEs Funktion mit va-arg "weiterverwenden"


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo zusammen,

folgendes Problem:

ich hab eine Funktion fertig, die folgendermaßen aussieht:
1
uint8_t qprintf(char *str, const uint8_t size, const char *format, ...)
2
{
3
    va_list ap;
4
    ...
5
    va_start(ap, format);
6
    ...
7
    s = va_arg(ap, char *);
8
    ...
9
}

und möchte nun eine zweite Funktion haben:
1
uint8_t lcd_printf(uint8_t row, const char *format, ...) 
2
{
3
}
diese soll nun die erste funktion qprintf() "mitnutzen"

wie krieg ich die va_list der zweiten Funktion in die erste rein?


Danke, Michi

von Karl H. (kbuchegg)


Lesenswert?

Am einfachsten, indem du aus qprintf den Teil, der die va_list 
abarbeitet rausnimmst und in eine eigene Funktion packst.

Du hast dann eine Funktion, die eine va_list in den Funktionsparametern 
hat und die kannst du dann wieder von beiden Funktionen aufrufen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

ähhh... d.h. sozusagen eine "vqprintf()" (in ahnlehnung an die v*printf) 
bauen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael Reinelt schrieb:
> ähhh... d.h. sozusagen eine "vqprintf()" (in ahnlehnung an die v*printf)
> bauen?

Jepp. Anders gehts nicht.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

D A N K E !

tut schon!

von Uli (Gast)


Lesenswert?

Du kannst doch einfach Dein va_list ap an den (...) teil der inneren 
funktion weitergeben....


Also...

void innen(chr* fmt, ... ) {


}

void auusen(char* fmt, ... )
{

  va_list argptr;
  va_start(argptr,fmt);
  innen( fmt, argptr);
  va_end(argptr);
}

von Sven P. (Gast)


Lesenswert?

Uli schrieb:
> Du kannst doch einfach Dein va_list ap an den (...) teil der inneren
> funktion weitergeben....
Das bringt aber nicht das erwünschte Ergebnis. Er könnte dann nämlich 
die va_list gewinnen, nicht aber unmittelbar die Argumente.

Der spezifizierte und übliche Weg ist tatsächlich, die ursprüngliche 
Funktion in eine v*-Funktion und einen Wrapper dazu aufzuteilen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.