Benötige Erläuterung zu "printf"

Hallo,

ich bin noch recht frisch in der Programmierung und benötige mal eine kurze Erläuterung für eine Codezeile, die ich in einem anderen alten Thread gefunden habe:

char s[20];
sprintf(s,"%02u:%02u:%02u",hour, min, sec);
Serial.println(s);

Es geht nur um die zweite Zeile. Ich habe keinen Befehl sprintf gefunden, ist das ein Tippfehler?
Bewirkt der Befehl printf, das der ermittelte Wert in der ersten Variable (also 's') abgelegt wird?

Also quasi: packe hour, min, sec mit der Formatierung "%02u:%02u:%02u" in die Variable S ???

Für entsprechende Hilfe wäre ich sehr dankbar.

ist das ein Tippfehler?

Nein, das ist C++ 8) 8)

Bitte lesen und den Verweisen folgen: sprintf

Also alles so wie vermutet.

Vielen Dank für die super schnelle Antwort

DO3GE:
Also alles so wie vermutet.

In Sachen, wie sprintf() funktioniert: Ja, durchaus!

Allerdings mit dem Tippfehler: Nein.
Ich vermute mal, dass diese irrige Annahme dich davon abgehalten hat "Arduino sprintf" in die Suchmaschine deiner Wahl einzuhacken.
Denn mein Google liefert ca. 150 tausend Ergebnisse dazu.

DO3GE:
Vielen Dank für die super schnelle Antwort

Gerne doch!

Nein, das ist C++ 8)

Genaugenommen ist es sogar C.
Es soll Leute geben, die Wert darauf legen, C wäre was anderes als C++ :wink:

Hier relevant ist evtl., dass standardmäßig bei Arduinos avr-gcc nicht alle Formatierungen unterstützt werden. Insbesondere, was Gleitkommazahlen (%f) angeht.

combie:
Nein, das ist C++ 8) 8)

Sorry, printf und Konsorten ist ältestes C, für C++ wäre >> für formatierte Ausgaben charakteristisch.

Genaugenommen ist es sogar C.

Sorry, printf und Konsorten ist ältestes C

Haarspalterei!
Die C++ Referenz spricht da eine klare Sprache
Schon dadurch, dass sie diese Funktion dokumentiert.
Rüben und Sommerpilze, werden da übrigens nicht dokumentiert.

Alleine, dass sich der sprintf() Aufruf in einer *.cpp oder *.ino Datei befindet, und durch einen C++ Compiler genudelt wird, reicht um dieses als C++ Code zu bezeichnen.
Und genau das ist hier der Fall.

Ob sprintf() selber in C geschrieben ist, ist doch dabei völlig egal.

Natürlich wurde viel aus C übernommen, als C++ "erfunden" wurde.
So auch sprintf() und seine Brüder.
Die gesamte cLib(?).

Hier relevant ist evtl., dass standardmäßig bei Arduinos avr-gcc nicht alle Formatierungen unterstützt werden. Insbesondere, was Gleitkommazahlen (%f) angeht.

Aktivierbar!
Alle Komponenten sind dafür vorhanden.

Es soll Leute geben, die Wert darauf legen, C wäre was anderes als C++

Was man auch einfach beweisen kann, dadurch, dass nicht jeder C Code durch einen C++ Compiler genudelt werden kann.

Kompromissvorschlag:
sprintf() wurde ursprünglich für/in C entwickelt, und ist (seit ca 40 Jahren) auch Teil des C++ Standards.
Der sprintf() Aufruf ist also C oder/und C++, in Abhängigkeit davon, welcher Compiler das zu sehen bekommt.

Wesentlich ist doch, ob Quelltext von einem C oder nur von einem C++ Compiler übersetzt werden kann. Zwar können C++ Compiler beides, aber C++ ist auf jeder Plattform etwas anders und inkompatibel. Selbst die Arduino IDE kocht ihr eigenes Süppchen bei der Aufbereitung der *.ino Dateien in *.cpp.
Deshalb sind alle wesentlichen Linux Bibliotheken C und nicht C++, damit sie überall benutzbar sind.

combie:
sprintf() wurde ursprünglich für/in C entwickelt, und ist (seit ca 40 Jahren) auch Teil des C++ Standards.

Jeder C++ Compiler muß auch C können, da muß nichts von C nach C++ "übernommen" werden. Mehr ein Fluch als ein Segen, aber so wurde das vereinbart.

Jeder C++ Compiler muß auch C können,

Och nöö, das ist eine lustige Idee, aber doch nicht wahr...

Erst hieß es "C mit Klassen".
Spätestens, seit es C++ gibt/heißt stimmt es nicht mehr.
Die Entwicklungslinien sind nicht mehr (eng) gekoppelt.


Deshalb sind alle wesentlichen Linux Bibliotheken C und nicht C++, damit sie überall benutzbar sind.

Der Linus hat sich klar geäußert, warum kein C++ im Kern.
Das Argument war nicht dabei.

Es ist ein Kinderspiel, C Libs in C++ einzubinden ( ! linken, nicht kompilieren ! ).
Aber die Nutzung von C++ Klassen in C ist eher schwierig.

sprintf()? Immer dieses unsichere Zeugs...

Nehmt snprintf()...

Rintin:
sprintf()? Immer dieses unsichere Zeugs...

Nehmt snprintf()...

Du hast ja Recht, aber snprintf ist auch C , also lenk nicht ab von unserer OT-Diskussion :slight_smile:

@combie: Meine These: "C-Code, der nicht von einem C++ Compiler compiliert werden kann (wohl aber vom C-Compiler), hat Fehler die nur im C-Standard nicht angemeckert werden."
Kennst du bessere Beispiele, die widerlegen dass C eine Untermenge von C++ ist?

Oder geht es dir um Calling Conventions, Name Mangling und wie C/C++ Compiler und Linker sich gemeinsam verständigen? Da kann es schon einen Unterschied machen ob C - Code von einem C-Compiler oder von einem C++-Compiler übersetzt wurde. Und bei Arduino wird snprintf von einem C++ Compiler übersetzt, da gebe ich dir gerne recht.

Oder geht es dir um

Mir geht es darum, klar zu machen, dass C keine Teilmenge von C++ ist.

Vielleicht früher mal, aber schon lange nicht mehr.
C ist eine Sprache und C++ ist eine andere.

Viele, viele Gemeinsamkeiten, aber keine Teilmenge.
Es gibt eine "Schnittmenge".
"Schnittmenge" != "Teilmenge"
(den Unterschied muss ich nicht erklären, oder?)

@combie: Meine These: "C-Code, der nicht von einem C++ Compiler compiliert werden kann (wohl aber vom C-Compiler), hat Fehler die nur im C-Standard nicht angemeckert werden."
Kennst du bessere Beispiele, die widerlegen dass C eine Untermenge von C++ ist?

C kennt das Schlüsselwort __flash um Variablen ins Flash zu stopfen. C++ nicht.
C++ benötigt spezielle Zugriffsfunktionen um auf Flash Variablen zuzugreifen, C nicht.

restrict ist auch so ein Ding

_Static_assert, heißt in C++ static_assert
usw...
Da gibts einige Schlüsselworte im C Sprachstandard, welche in C++ nicht, oder anders, existieren.

Merke: Das sind Unterschiede im Standard.
Keine Besonderheiten irgendeines speziellen Kompilers.

Natürlich darfst du Programme, die sich an den C Standard halten, aber nicht unter C++ kompiliert werden können, als fehlerhaft/defekt bezeichnen.
Das wird der Sache aber nicht mehr gerecht, auch wenn es die Angelegenheit für dich vereinfacht.

Es ist ein bisschen so, wie mit Affe und Mensch.
Irgendwann haben sich die Linien aufgespalten.
Und jetzt sind sie so verschieden, trotz 98% Übereinstimmung, dass keine gegenseitige Befruchtung mehr möglich ist.