OT sprintf(), snprintf() nutzen auf Mega R3

Es wird oft geschrieben das sprintf() nicht funktioniert auf AVR, oder geht bei der Aussage nur um Speicherverbrauch.
Habe gestern etwas rumgespielt mit Mega 2560 R3, und das unten gezeigtes funktioniert.
Die Lib für lcd ist die LCDWIKI_KBV was sollte nichts zu sagen haben.
Sehe gerade das ich %.1d:%.2d:%.2d genommen habe, ist egal es funktioniert :wink:

char datumAnzeige[20];
  sprintf(datumAnzeige, "%.1d.%4s%.2d",
          now.day(), Monat[now.month()], now.year());
  lcd.Print_String(datumAnzeige, 82, 50); 

  char uhrzeitAnzeige[20];
  snprintf(uhrzeitAnzeige, 20, "%.1d:%.2d:%.2d",
           now.hour(), now.minute(), now.second());
  lcd.Print_String((uhrzeitAnzeige), 100, 90); 

Gruß
Bernhard

Hallo Bernhard, was genau möchtest Du uns damit sagen? Und auch was meinst Du mit 'Die Lib für LCD ist die LCDWIKI_KBV was sollte nichts zu sagen haben' ?
ist nicht als Angriff oder so gemient, ich verstehe es nur nicht. kann aber auch daran liegen, dass Hochdeutsch nicht meine Mutersprache ist, sondern eine in der Schule vor langer Zeit mal angelernte Fremdsprache.

Ja! (fast)

Bei AVRs, also auch deinem Mega, ist float und double für sprintf deaktiviert.
Kann man aber aktivieren.

Habe nichts freigegeben, freigeschaltet hat sofort funktioniert. War nur Test.

Nicht zugehört?
Bemerke: float und double

Und nein, das tuts auch bei dir nicht.

Ja habe gelesen, wie soll ich Dir Beweisen dass das was geschrieben habe funktioniert im kompletten Sketch, Foto, Video wohl nicht sonst sagst Du habe Präpariert, nicht die Wahrheit aufgenommen
Bis 100Km ab Köln, kann vorbei kommen mit meinem Krempel :wink:

Bedeutet das die Lib für das Display nichts mit dem zu tun hat.

Du hast nur ganze Zahlen und Zeichenketten getestet. Die gehen auch. Was Du nicht getestet hast ist float und das geht auf den AVR ohne Freischaltung nicht. Probiere es aus.
Das wpllte Dir @combie sagen.

Gruß Tommy

Das habe ich nicht bezweifelt.

Vielleicht, aber offensichtlich nicht verstanden!

Vielleicht kennst du auch die von mir genannten Datentypen nicht..
Hier eine Erklärung: Floating-point types

Es ist ok, wenn du mir nicht glaubst, aber vielleicht akzeptierst du ja die Doku:

Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but only the # additional option can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). This version can be requested using the following compiler options:

Danke.
Ja wie man sieht in den Codeschnipsel habe nur Datum, und Uhrzeit zu Anzeige gebracht.
Wo aber im Datum der Monath wird als String? (Wort) angezeigt.
Und JA mit Float und Double habe nicht rumgespielt, wollte nur um die über 10 Zeile mit Minimum 5 If den Sketch kürzen.

Ich habe die aussagen zu sprintf() und snprintf () so verstanden dass das im keinem Fall funktioniert.

Wie auch im #1 angemerkt, ist mir erst Heute eingefallen das ich Double ( %1d) genommen habe, wo auch ein Int reicht und wird ja wahrscheinlich benutzt.

Die funktionieren schon immer.
Was nicht funktioniert auf den AVR ist: .printf()
Es ist etwas anderes, wenn ich auf einem ESP Serial.printf() benutze oder auf einem AVR erst eine Variable füllen muss, die dann zur Anzeige gebracht wird.

printf und seine Brüder funktionieren ganz prächtig.
Da musst du was falsch verstanden haben, oder derjenige wusste es selber nicht besser.

Ich habe dir doch die Doku verlinkt!
Da steht ganz klar:

The conversion specifiers and their meanings are:
diouxX The int (or appropriate variant) argument is converted to signed decimal (d and i),

Ich übersetze:

Das d in %1d bezeichnet einen mit Vorzeichen behafteten Integer Datentype

Hat also mit dem Datentype double oder float nichts zu tun.

OK Danke, wider was Gelernt, habe die Übersetzung falsch verstanden, was ich aber weis das mit %i tuts auch ohne Änderung am Speicherverbrauch.
Ist eben So wen man nicht Englisch gelernt hat.

Natürlich funktioniert printf() auch auf AVR, wird nur nicht von Arduino vorgekaut ausgeliefert.

Und, dass Print::printf() auf AVR nicht existiert möchte ich mal als positiv bewerten, spart es doch reichlich Flash ein.

Hier, printf für AVR (aus meiner Wühlkiste):




int writeChar(char Character, FILE *)
{
  return !Serial.write(Character);
}

int readChar(FILE *)
{
   int c;
   while(-1 == (c=Serial.read()));
   return c;
}



FILE stdiostream;


void setup() 
{
  fdev_setup_stream(&stdiostream, writeChar, readChar, _FDEV_SETUP_RW);
  stdin = stdout = stderr = &stdiostream;

  
  Serial.begin(9600);

  signed value = 72;
  printf("testHex 0x%02X\r\n",value);
  printf("testDezimal %02d\r\n",value);
}

void loop()
{
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.