Forum: Compiler & IDEs optionale Parameter in C?


von see4far (Gast)


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

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


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

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


Lesenswert?

s/<varargs.h>/<stdarg.h>/ ;-)
(seit ca. 1989...)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ach ja, immer diese hektischen Neuerungen. Danke für den Hinweis.

von Ulrich P. (uprinz)


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...
1
int csh_PrintF( STRPTR formatString, ... )
2
{
3
  va_list vlist;
4
  int cnt;
5
6
  if( Gbl_BridgeModeActive)
7
    cnt = fprintf_P( VCOM, formatString, vlist);
8
  else
9
    cnt = fprintf_P( VCOM, formatString, vlist);
10
    return cnt;
11
}
...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

von Rufus Τ. F. (rufus) Benutzerseite


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:
1
void mein_printf(char* format, ...)
2
{
3
  va_list argptr;
4
5
  va_start(argptr, format);
6
7
  vprintf(Format, argptr);
8
}

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


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.

von Ulrich P. (uprinz)


Lesenswert?

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

Gruß, Ulrich

von Rolf Magnus (Gast)


Lesenswert?

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

Da fehlt noch ein:

va_end(argptr);


> }

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Richtig.

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.