flasstinghelper und vsnprintf _va_args_

OP #6774438
Hi
Ich habe ein Problem mit PROFMEM char* mit vsnprintf.
Die Ausgabe ist ok mit F(string) und normalen Parametern.
Sobal aber ein F() Parameter angegeben ist funktioniert das ganze nicht 
mehr.

Wie muss ich die arglist Konvertieren und wie sehe ich ob es ein F( 
string ist?

1
#define   fstr_Test1    F("Test %s")
2
#define   fstr_TestOn   F("on")
3
#define   str_TestOff   "off"
4

5
void out(const __FlashStringHelper* pStr, ...);
6

7
void setup() {
8
  Serial.begin(115200);
9
  out(fstr_Test1, fstr_TestOn);   // do not works
10
  out(fstr_Test1, str_TestOff);   // ok works
11
}
12

13
void loop() {
14
}
15

16
void out(const __FlashStringHelper* pStr, ...) {
17
  char* sTemp;
18
  sTemp = (char*)malloc(100);
19
  va_list argList;
20
  va_start(argList, pStr);
21
#ifdef __AVR__
22
  vsnprintf_P(sTemp, 100, (const char*)pStr, argList); // progmem for AVR
23
#else
24
  vsnprintf(sTemp, 100, (const char*)pStr, argList); // for the rest of the world
25
#endif  
26
  va_end(argList);
27
  Serial.println(sTemp);
28
  free(sTemp);
29
}
Gast
Du musst zwischen den Format-String und den Format-Parametern 
unterscheiden.  die _P-Funktionen benötigen einen PROGMEM-Format-String 
- die zu formatierenden Parameter bleiben gleich.  Um einen 
PROGMEM-Parameter zu formatieren, mußt du "%S" (groß-S) statt "%s" 
benutzen (AVR-Erweiterung).
OP
foobar schrieb:
> Du musst zwischen den Format-String und den Format-Parametern
> unterscheiden.  die _P-Funktionen benötigen einen PROGMEM-Format-String
> - die zu formatierenden Parameter bleiben gleich.  Um einen
> PROGMEM-Parameter zu formatieren, mußt du "%S" (groß-S) statt "%s"
> benutzen (AVR-Erweiterung).

Herzlichen Dank!
Funktioniert.

Kann Du mir noch verraten wo das geschrieben steht.
Konnte das im Netz nirgends finden.

Grüsse.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.