Wahrscheinlich fehlt mir nur der richtige Suchbegriff -- dass man das, was ich möchte, zu Fuß programmieren muss, kann ich mir nicht vorstellen.
Wie kann ich eine Zahl so ausgeben, dass sie immer vier Zeichen „breit“ ist? Ziel ist eine simple Tabelle, die die aktuellen Werte der Analog-Pins (analogRead()) ausgibt. Muss ich mir dazu irgendein if()-Gewurschtel antun?
Tommy56:
Probiers mal damit (nicht optimiert, nur schnell runter geschrieben und kurz getestet):
...
Danke!
Du programmierst offensichtlich nicht erst seit gestern. Daher nehme ich an, dass es etwas wie ein setw() oder setfill() nicht gibt (denn sonst würdest Du damit arbeiten)?!
Ich bin mild entsetzt dieser cout-Kram, den ich kenne, mag ja urzeitlich anmuten, aber dort kann man wenigstens entsprechende „IO-Manipulatoren“ benutzen.
Hallo Gregor,
wenn's nur ganzzahlige Werte sein sollen, kannst Du das ganz einfach mit sprintf erledigen.
char txtbuf[20];
void setup() {
// put your setup code here, to run once:
Serial.begin( 115200 );
for ( int i=0; i<1200; i+=98 ) {
sprintf( txtbuf, " %4d" , i ); Serial.println( txtbuf );
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Nö, ich programmiere schon einige Jahrzehnte. Bei C hatte ich ab 2007 bis 2016 eine Pause und musste erst wieder Staub wischen.
Wir haben damals nicht mit dem Streaming von C++ gearbeitet, deshalb benutze ich das wenig und fülle meine Arrays lieber selbst. printf wäre auch noch eine Alternative.
Es gibt aber eine Streaming-Lib für den Arduino, In wieweit die Formatierungen beinhaltet, weiß ich nicht. Auch PString ist einen Blick wert.
MicroBahner:
wenn's nur ganzzahlige Werte sein sollen, kannst Du das ganz einfach mit sprintf erledigen.
...
Danke für den Hinweis! Da sprintf nicht in der hiesigen Referenz und auch in meinem C/C++-Buch nicht steht, nehme ich an, dass das etwas unheimlich Geheimes oder wenigstens Illegales ist. Gibt es dazu irgendeine Seite, die ich lesen kann?
Wenn dir cout und dessen Manipulatoren altertümlich vorkommen, triffst du hier Leute, die solch neumodischen Kram für mühsam und kompliziert halten.
Ein Buch in dem sprintf nicht vorkommt, ist mir suspekt:)
Da ist nix geheimes dran, ist ein Element der stdio.h von C. Auf dem Arduino nur etwas 'kastriert' um die Formatierung der floatingpoint-Variablen, da das dann etwas zu viel Platz im Flash brauchen würde.
Ein vollständige Beschreibung der Formatierungszeichen findest Du hier. Aber wie gesagt, floatingpoint geht auf dem Arduino nicht.
michael_x:
Wenn dir cout und dessen Manipulatoren altertümlich vorkommen, triffst du hier Leute, die solch neumodischen Kram für mühsam und kompliziert halten.
Ja, ich weiß ... ein Freund hat C/C++ auf „seine“ Art gelernt und hielt cout für das Ältere und printf() für die „bessere, neuere“ Variante. Auf einem Arduino käme der wahrscheinlich schneller zurecht als ich. Allmählich dämmert mir, dass ich mir diesen ganzen C-String-Müll doch noch antun muss, mit strbla und strblubb ...
michael_x:
Ein Buch in dem sprintf nicht vorkommt, ist mir suspekt:)
Dafür hält es sich vermutlich an irgendeinen Standard.
MicroBahner:
Da ist nix geheimes dran, ist ein Element der stdio.h von C. Auf dem Arduino nur etwas 'kastriert' um die Formatierung der floatingpoint-Variablen, da das dann etwas zu viel Platz im Flash brauchen würde.
Es muss etwas Geheimes dran sein. Wenn dem nicht so wäre, würde ich das schon seit Jahren kennen. Aber es steht weder hier in der Referenz, noch in meinem C/C++-Referenzschmöker, den ich bislang eigentlich ganz gut fand (zumindest steht es da nicht im Index).
MicroBahner:
Ein vollständige Beschreibung der Formatierungszeichen findest Du hier. Aber wie gesagt, floatingpoint geht auf dem Arduino nicht.
Fließkommazahlen sind in meinem Fall nicht gefragt. Ich möchte nur das, was mir analogRead() liefert, in einer festen Breite ausgeben können.
michael_x:
Wenn dir cout und dessen Manipulatoren altertümlich vorkommen, triffst du hier Leute, die solch neumodischen Kram für mühsam und kompliziert halten.
gregorss:
Es muss etwas Geheimes dran sein. Wenn dem nicht so wäre, würde ich das schon seit Jahren kennen.
Dann sind einfach deine Jahre zu kurz . In der vor-C++ Ära gabs da nix anderes, und das gehörte zum Grundwissen. Und nicht selten hat das 'altbewährte' auch sein Gutes
gregorss:
Aber es steht weder hier in der Referenz,
Die Arduino-Referenz ist auch nicht vollständig, was C angeht. Das gehört einfach zur AVR-Toolchain, und die Kastrierung um floatingpoint kommt auch aus dieser Toolchain - hat mit Arduino eigentlich nicht direkt zu tun, die setzen das nur ein.
Beim Arduino DUE hast Du die Einschränkung nicht.
Wenn Du die STM32duino Erweiterung installierst ( für die STM32F1.. Prozessoren ) da funktioniert float auch.
Und bei allen gibt es sprintf 8) 8)
gregorss:
Fließkommazahlen sind in meinem Fall nicht gefragt. Ich möchte nur das, was mir analogRead() liefert, in einer festen Breite ausgeben können.
Die Stringklasse ist auf dem Arduino aber meistens als Müll zu betrachten, im Gegensatz zu Chararrays
Da gebe ich dir Recht, aber manche verwenden das Wort c-string (im Zusammenhang mit strblah Funktionen) für unsere char-Arrays. Das Böse sind die String Objekte. Zwecks Vermeidung von Missverständnissen vermeide ich den Ausdruck c-string.
Die Funktionstrstrz.B. wird in c++ übrigens per#include <cstring>deklariert, wenn es einem keiner sonstwie abnimmt und versteckt. Der Name c-string für char arrays die mit '\0' enden, ist also nicht ganz daneben...
michael_x:
Da gebe ich dir Recht, aber manche verwenden das Wort c-string (im Zusammenhang mit strblah Funktionen) für unsere char-Arrays. Das Böse sind die String Objekte. Zwecks Vermeidung von Missverständnissen vermeide ich den Ausdruck c-string.
Die Funktionstrstrz.B. wird in c++ übrigens per#include <cstring>deklariert, wenn es einem keiner sonstwie abnimmt und versteckt. Der Name c-string für char arrays die mit '\0' enden, ist also nicht ganz daneben...
Ich versuche das immer mit dem Begriff "Zeichenketten" zu umschiffen.
gregorss:
... steht weder hier in der Referenz, noch in meinem C/C++-Referenzschmöker, den ich bislang eigentlich ganz gut fand (zumindest steht es da nicht im Index).
Nochmal zurück zum Thema:
Zu "rechtsbündig" findet man auch schonmal sowas:
if (x < 1000) lcd.print(' ');
if (x < 100 ) lcd.print(' ');
if (x < 10 ) lcd.print(' ');
lcd.print(x);