Forum: PC-Programmierung Operator weitergeben


von Blub (Gast)


Lesenswert?

Hallo!

Ich habe eine Funktion, die als letztes Argument einen ...-Operator 
verwendet.
Nun soll in Abhängigkeit der Konfiguration innerhalb dieser Funktion 
eine andere aufgerufen werden, wo diese nicht näher spezifizierten 
Argumente ebenfalls über einen ...-Operator weitergegeben werden sollen.
Wie geht das?
1
void blub(int a, int b, ...)
2
{   
3
    va_list ap;
4
5
    <some code>    
6
    va_start(ap, b);
7
    <some code>
8
    va_end(ap);
9
    <some code>
10
11
    return;
12
}
13
14
void bla(char a, int b, int c, ...)
15
{  
16
    <some code>  
17
    blub(c, b, ...);
18
    <some code>      
19
}

Danke & Grüße
Blub

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Blub schrieb:
> Wie geht das?

Gar nicht.

Deine aufgerufene Funktion kann nicht selbst die so genannte Ellipse 
("...") als Argument nehmen, sondern sie muss selbst ein va_list 
Argument übernehmen.

Sieh dir das einfach mal an, wie sich printf() und vprintf() 
unterscheiden.

von Blub (Gast)


Lesenswert?

Geht doch!
1
void blub(int a, int b, ...)
2
{   
3
  va_list ap;
4
5
  <some code>    
6
  va_start(ap, b);
7
  <some code>
8
  va_end(ap);
9
  <some code>
10
11
  return;
12
}
13
14
void bla(char a, int b, int c, ...)
15
{    
16
  va_list org;
17
  
18
  va_start(org, c);
19
  blub(c, b, org);
20
  va_end(org);      
21
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn ein Compiler diesen Mischmasch tatsächlich compilieren und 
sinnvoll abarbeiten sollte, dann wäre das reiner Zufall.

Natürlich kannst du auch eine va_list als "..."-Argument übergeben – 
aber das ist nicht das, wie <stdarg.h> gedacht und konzpiert worden ist. 
Eine va_list sollte man schon genau da übergeben, wo auch eine va_list 
vom Aufgerufenen erwartet wird.

von Rolf M. (rmagnus)


Lesenswert?

Was man machen kann, ist bla als variadisches Makro statt als Funktion 
zu schreiben.
https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

von P.Loetmichel (Gast)


Lesenswert?

Man könnte auch Funktionspointer übergeben!

Oder gleich Bascom benutzen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Blub schrieb:
> Geht doch!

Natürlich ist der Code (wenn man die <some code>-Zeilen auskommentiert)
standardkonformes C, weswegen der Compiler keine Fehlermeldung ausgibt.
"Standardkonform" heißt aber noch lange nicht "erwartungsgemäß
funktionierend" :)

Versuch mal, in blub() die mit <some code> markierte Stelle mit
sinnvollem Code auszufüllen:

1
  va_start(ap, b);
2
  <some code>
3
  va_end(ap);

Dann wirst du sehr wahrscheinlich merken, dass deine Art und Weise,
stdarg.h zu verwenden, nicht zum gewünschten Ziel führt.

Du könntest an dieser Stelle natürlich aus ap mit va_arg eine weitere
va_list ap2 auslesen, diese mit einem weiteren va_start initialisieren
und dann aus ap2 mit va_arg die eigentlichen Argumente auslesen. Das
wäre dann so ziemlich die unsinnigste, umständlichste, verworrene und
fehlerträchtigste Methode, dein Ziel zu erreichen, für das es einen ganz
geradlinigen Weg gibt :)

Blub schrieb:
> wo diese nicht näher spezifizierten Argumente ebenfalls über einen
> ...-Operator weitergegeben werden sollen.

Was sind die Gründe dafür, dass das so sein soll?

Übergib einfach die va_list als Argument (ohne die ...), und der Käse
ist gegessen.

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.