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.

: Bearbeitet durch Moderator
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.

: Bearbeitet durch Moderator
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.