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)


Bewertung
0 lesenswert
nicht 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?
void blub(int a, int b, ...)
{   
    va_list ap;

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

    return;
}

void bla(char a, int b, int c, ...)
{  
    <some code>  
    blub(c, b, ...);
    <some code>      
}

Danke & Grüße
Blub

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Geht doch!
void blub(int a, int b, ...)
{   
  va_list ap;

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

  return;
}

void bla(char a, int b, int c, ...)
{    
  va_list org;
  
  va_start(org, c);
  blub(c, b, org);
  va_end(org);      
}

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Man könnte auch Funktionspointer übergeben!

Oder gleich Bascom benutzen.

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht 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:

  va_start(ap, b);
  <some code>
  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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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