Forum: PC-Programmierung Operator weitergeben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.