Mit stdarg kannst du doch eh deine ganzen Parameter fertig formatiert in einen string schreiben und denn einfach ausgeben. Dazu brauchts kein sprintf mehr.
mfg
hi,
wie kann ich eine Funktion mit einer variablen Parameterliste entwerfen, so dass diese intern eine weitere Funktion mit genau derselben (variablen) Parameterliste als Hilfsfunktion aufruft?
also z.B
:
Code:#include <stdio.h> #include <stdarg.h> int fprintfln ( FILE * stream, char format[], ... ) { // gefaketes und modifiziertes fprintf char sbuf[100]; va_list arguments; // irgendwie pointer * oder & auf arguments...? sprintf(sbuf, format, & arguments ); // ??? // // stream->println(sbuf); // }
[/code]
Geändert von HaWe (11.03.2015 um 20:42 Uhr)
Mit stdarg kannst du doch eh deine ganzen Parameter fertig formatiert in einen string schreiben und denn einfach ausgeben. Dazu brauchts kein sprintf mehr.
mfg
wie genau meinst du das? Ganz soweit fortgeschritten mit stdarg.h bin ich noch nicht...
meinen Aufruf hatte ich geplant z.B. (als vereinfachtes Beispiel, wie bei fprintf)
wie soll das jetzt allein per stdarg gehen?Code:#include <SPI.h> #include <SD.h> File myFile; int fprintfln ( FILE * stream, char format[], ... ) // Implementierung { // // // } void loop() { // fprintfln( &myFile, "%s %d %f", "Teststring", 2, PI ); // Aufruf z.B. im Hauptprogramm // }
Geändert von HaWe (01.03.2015 um 19:18 Uhr)
So:
mfgCode:int fprintfln ( FILE * stream, const char format[], ... ) { char sbuf[100]; va_list vl; va_start(vl, format); vsprintf(sbuf, format, vl); stream->println(sbuf); va_end(vl); }
hallo,
noch eine Anschlussfrage:
gibt es eine Möglichkeit herauszubekommen, welche Anzahl an Argumenten das C-Programm ermittelt hat (Zuweisung an eine Int-Variable)?
nicht nur bei Übergabegabe einer festen Anzahl
va_start( arguments, num);
sondern auch bei Übergabe eines fmt-Strings
va_start( arguments, fmtstr);
weiß ja C, mit welcher Anzahl man es zu tun hat.
Bei va_start( arguments, num); ist es offensichtlich - aber wenn ich intern nur fmtstr kenne, wie kann ich C das Geheimnis der Anzahl aus der Nase ziehen?
so nach dem Motto
num=arg_cnt(fmtstr) oder num=arg_cnt(arguments) o. ä.?
Ansonsten müsste man umständlich erst die Anzahl der '%' zählen und die Zahl der "%%" doppelt wieder abziehen... :-/
Geändert von HaWe (04.03.2015 um 17:25 Uhr)
Hast du das schon probiert?:
Code:int fscanf_ ( File * stream, const char fmtstr[], ... ) { ... // #debug Serial.print("fscancnt:"); Serial.println(cnt); va_end ( args ); Serial.println("Nach va_end(args)..."); return cnt; }
1. Nicht so wichtig: cnt hast du mal als int16_t, int32_t und als int in der Rückgabe von fscanf.
2. Was passiert wenn du die Funktion fscanf zu einer void-Funktion machst? Ich habe die Vermutung, das da beim Rücksprung im Stack irgendwas schiefläuft. Aber warum?
habe alles durchprobiert:
- komplett alle int-Typen als int16_t : keine Änderung
- fscanf_ als void: auch keine Änderung![]()
Geändert von HaWe (05.03.2015 um 12:07 Uhr)
Probiers mal mit kürzeren Bufferlängen. Falls du einen Arduino Uno benutzt bist du mit 2*1024 Bytes schon bei genau 2kB, was der SRAM-Größe entspricht. Da aber der Stack auch Platz braucht, ist das schon ein Problem.
Lesezeichen