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
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.
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.
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
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 | }
|
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.
Vielen Dank! Das war es, was ich wissen muss, dann kann es ja problemlos weiter gehen. Gruß, Ulrich
> void mein_printf(char* format, ...) > { > va_list argptr; > > va_start(argptr, format); > > vprintf(Format, argptr); Da fehlt noch ein: va_end(argptr); > }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.