www.mikrocontroller.net

Forum: Compiler & IDEs optionale Parameter in C?


Autor: see4far (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Kleine Frage: Kann ich in C auch optionale Parameter verwenden? Bei mir
motzt der Compiler rum, aber vllt mach ich ja auch was falsch. Habs so
versucht, wie es wohl in C++ richtig wäre. Kann C das nicht?

mfg
see4far

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll "vllt" sein?  Klemmen da ein paar Tasten?

Ansonsten: jedes Buch über Standard-C sollte dir das beschreiben,
printf() ist ein typischer Kandidat für eine solche Funktion und ist
eigentlich das Allererste, was einem in C (nicht auf einem Controller)
so übern Weg läuft.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um so etwas zu implementieren, dienen die Funktionen va_start und
va_arg, deren Deklarationen neben anderem benötigten Kram in der
Headerdatei "varargs.h" zu finden sind.

Mal im C-Buch nach "va_start" suchen.

"vllt" ist eine wirklich hässliche Abkrzg., da hat Jörg nur recht
mit.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s/<varargs.h>/<stdarg.h>/ ;-)
(seit ca. 1989...)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, immer diese hektischen Neuerungen. Danke für den Hinweis.

Autor: Ulrich P. (uprinz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Muss den Thread mal ausgraben...

Ich brauche eine Funktion mit variabler Anzahl Parameter in WinAVR. Ich 
kann aber keine varargs.h oder stdarg.h in den Includes von WinAVR 
finden. Da ich noch mitten am Portieren der Software bin, kann ich auch 
noch keinen vollständigen Compilerlauf machen. Ich bin aber schon so 
weit, dass ich bei folgender Routine...
int csh_PrintF( STRPTR formatString, ... )
{
  va_list vlist;
  int cnt;

  if( Gbl_BridgeModeActive)
    cnt = fprintf_P( VCOM, formatString, vlist);
  else
    cnt = fprintf_P( VCOM, formatString, vlist);
    return cnt;
}
...folgende Warning bekomme:
../bridge_drv.c:107: warning: 'vlist' is used uninitialized in this 
function

Unterstützt WinAVR variable Funktions-Definitionen nicht oder ist dieser 
Teil in einem anderen aufgegangen, oder kann ich die Warning ignorieren, 
bzw. irgendwie gezielt abschalten ohne mir andere Warnings bzgl. 
uninitialisierter Variablen zu verbauen?

Danke schon mal,
Ulrich

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, Du musst schon noch va_start aufrufen, um die Variable 'vlist' 
entsprechend zu initialisieren.
Woher soll der Compiler wissen, was Du damit vorhast?

Die Warnung ist daher vollkommen korrekt und sollte - wie andere 
Warnungen auch - nicht ignoriert werden.

Und fprintf weiß auch in der _P-Variante nichts mit einem Argument vom 
Typ va_list anzufangen.

Dazu ist eine der v-Versionen von printf (vprintf, vsprintf etc.) 
erforderlich.

Das sieht dann (in etwa) so aus:
void mein_printf(char* format, ...)
{
  va_list argptr;

  va_start(argptr, format);

  vprintf(Format, argptr);
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stdarg.h ist übrigens da, auch wenn es nicht dort ist, wo du es
zuerst suchen würdest.  Das hängt damit zusammen, dass die
Installation zwischen solchen Header-Dateien unterscheidet, die
zur (System-)Bibliothek gehören und solchen, die zum Compiler
gehören.  <stdarg.h> fällt in die zweite Gruppe.

Autor: Ulrich P. (uprinz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!
Das war es, was ich wissen muss, dann kann es ja problemlos weiter 
gehen.

Gruß, Ulrich

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> void mein_printf(char* format, ...)
> {
>   va_list argptr;
>
>  va_start(argptr, format);
>
>  vprintf(Format, argptr);

Da fehlt noch ein:

va_end(argptr);


> }

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig.

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.
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.