Go Down

Topic: Increment und Decrement Variable! (Read 1 time) previous topic - next topic

7ower3efender

Deine Zahlen mit führenden Leerzeichen formatieren, so dass die immer an der gleichen Stelle enden.
Entweder händisch, wenn der Speicher knapp wird oder mit printf (Seriell) / sprintf (Puffer).

Gruß Tommy
Ich meine wenn sich die Zahlen (Variablen) ändern, dann ändern sich die längen der Variablen und somit verschieben sich die Texte die hinter den Zahlen stehen aber ich möchte das diese Texte Fix stehen egal wie lang die Zahl ist oder wird

Tommy56

#61
May 23, 2019, 07:21 pm Last Edit: May 23, 2019, 07:22 pm by Tommy56
Ja, habe ich Dir doch geschrieben. Nachdenken musst Du selbst.

Du legst fest, wie lang maximal die Zahl wird, z.B. 6 Zeichen vor dem .
Dann formatierst Du 12.34 zu 000012.34 und 112.34 zu 000112.34 oder Leerzeichen anstelle von 0. Damit bleibt das Ende der Zahl immer an der gleichen Stelle.
Schaue Dir die Doku zu printf an.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

Meinst Du sowas?

Code: [Select]
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB
  }
  berechnung(5000UL, 161000UL);
  berechnung(10UL, 322UL);
}

void loop() {}

void berechnung(unsigned long abstand, unsigned long elapsedtime) {
  const double Milli = 1000.0;
  const double Micro = 1000000.0;
  const double Gewicht = 0.0002;            // Gewicht in Kilogramm
  const double Multiplikator = 0.5;
  const double FPS = 3.2808399;            // Umrechnungsfaktor (so genau wie möglich)
  double time = (double) elapsedtime / Micro;
  double speed = (double) abstand / 100 / time;
  double fps = speed * FPS;
  double energie = Multiplikator * Gewicht * (speed * speed);

  ausgabe("        Abstand:", abstand, " cm");
  ausgabe("           Zeit:", elapsedtime, " us");
  ausgabe("        Gewicht:", Gewicht * Milli, " g");
  ausgabe("Geschwindigkeit:", speed, " m/s");
  ausgabe("Geschwindigkeit:", fps, " FPS");
  ausgabe("        Energie:", energie, " J");
  Serial.println("=====");
}
void ausgabe(const char* text1, double wert, const char* text2) {
  Serial.print(text1);
  double max = 100000;
  for (byte j = 0; j < 6; j++) {
    Serial.print(' ');
    if (wert >= max) break;
    max /= 10;
  }
  Serial.print(wert);
  Serial.println(text2);
}
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

7ower3efender

#63
May 23, 2019, 07:46 pm Last Edit: May 23, 2019, 07:48 pm by 7ower3efender
Meinst Du sowas?

Code: [Select]
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB
  }
  berechnung(5000UL, 161000UL);
  berechnung(10UL, 322UL);
}

void loop() {}

void berechnung(unsigned long abstand, unsigned long elapsedtime) {
  const double Milli = 1000.0;
  const double Micro = 1000000.0;
  const double Gewicht = 0.0002;            // Gewicht in Kilogramm
  const double Multiplikator = 0.5;
  const double FPS = 3.2808399;            // Umrechnungsfaktor (so genau wie möglich)
  double time = (double) elapsedtime / Micro;
  double speed = (double) abstand / 100 / time;
  double fps = speed * FPS;
  double energie = Multiplikator * Gewicht * (speed * speed);

  ausgabe("        Abstand:", abstand, " cm");
  ausgabe("           Zeit:", elapsedtime, " us");
  ausgabe("        Gewicht:", Gewicht * Milli, " g");
  ausgabe("Geschwindigkeit:", speed, " m/s");
  ausgabe("Geschwindigkeit:", fps, " FPS");
  ausgabe("        Energie:", energie, " J");
  Serial.println("=====");
}
void ausgabe(const char* text1, double wert, const char* text2) {
  Serial.print(text1);
  double max = 100000;
  for (byte j = 0; j < 6; j++) {
    Serial.print(' ');
    if (wert >= max) break;
    max /= 10;
  }
  Serial.print(wert);
  Serial.println(text2);
}

So Ungefähr. Ich meine das zum Beispiel Abstand soll ganz Rechts stehen die Variable selber soll in der Mitte stehen da sie sich in ihrer länge ändert und die Einheiten ganz Rechts aber die Einheiten sollen trotzdem so nahe wie möglich mit maximal einem Abstand neben der Zahl stehen


Edit: ausgabe ("Abstand: ",            abstand," cm")
        ungefähr so

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

7ower3efender

So Ungefähr. Ich meine das zum Beispiel Abstand soll ganz Rechts stehen die Variable selber soll in der Mitte stehen da sie sich in ihrer länge ändert und die Einheiten ganz Rechts aber die Einheiten sollen trotzdem so nahe wie möglich mit maximal einem Abstand neben der Zahl stehen


Edit: ausgabe ("Abstand: ",            abstand," cm")
        ungefähr so

Das Problem ist bei mir aber wenn ich es mit Abständen mache dann verschiebt sich die Einheit nach hinten und nicht das die Zahl einfach nach vorne hin sich verschiebt??

agmue

#66
May 23, 2019, 09:25 pm Last Edit: May 23, 2019, 09:26 pm by agmue
Ausgabe von #62:


        Abstand:   5000.00 cm
           Zeit: 161000.00 us
        Gewicht:      0.20 g
Geschwindigkeit:    310.56 m/s
Geschwindigkeit:   1018.89 FPS
        Energie:      9.64 J
=====

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)


Doc_Arduino

Wenn Dich die gleichen Ergebnisse nicht verwundern, wo ist dann das Problem? Sehe ich es nicht oder gibt es das nicht?
Hallo,

ich weiß nicht wie du auf die Zahlen gekommen bist die du in deiner Rechnung verwendest. Aber wenn beide Zahlen das gleiche Verhältnis darstellen, dann spielt der Rest der Formel keine Rolle.
5000 / 161000 = 0,0310559...
10 / 322 = 0,0310559...
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

7ower3efender

Ausgabe von #62:


        Abstand:   5000.00 cm
           Zeit: 161000.00 us
        Gewicht:      0.20 g
Geschwindigkeit:    310.56 m/s
Geschwindigkeit:   1018.89 FPS
        Energie:      9.64 J
=====


genau so meine ich es doch da ich es ja nicht am Serielmonitor sondern am Oled Display ausgebe ist es für mich etwas komplizierter.

agmue

ich weiß nicht wie du auf die Zahlen gekommen bist die du in deiner Rechnung verwendest.
Durch Dreisatz der Werte aus #50, daher müssen die Werte per Taschenrechner auch identisch sein. Ich hatte das Thema möglicherweise mißverstanden, weil ich annahm, die Rechnung mittels float auf dem UNO sei ungenau.

Macht ja nichts, so wurde mein Teensy mal wieder entstaubt.

Wo Integerarethmetik eine Verbesserung gegenüber float bringen soll, erschließt sich mir nicht, da float doch hinreichend genug rechnet, oder?

genau so meine ich es doch da ich es ja nicht am Serielmonitor sondern am Oled Display ausgebe ist es für mich etwas komplizierter.
Verwendest Du eine proportionale Schrift?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Doc_Arduino

#71
May 24, 2019, 11:39 am Last Edit: May 24, 2019, 11:42 am by Doc_Arduino
Wo Integerarethmetik eine Verbesserung gegenüber float bringen soll, erschließt sich mir nicht, da float doch hinreichend genug rechnet, oder?
Von der Sache sollte dem TO die Genauigkeit mit float ausreichend sein. Will ja eh nur 2 Kommastellen. Da er jedoch betonte das er höchstmögliche Genauigkeit in seiner Rechnung haben möchte wurde die ganze Geschichte mit der Ganzzahlrechnung ins Leben gerufen. Deswegen machen wir den "Mist" hier. Die Rundungsfehler mit float sieht man nicht sofort. Aber wenn du mit float 2-3x hin und her rechnest bekommst du ein Problem. Wenn du mit dem Wert weiterrechnest ......  .  Dabei ist es egal welche Genauigkeit float hat, dass Ergebnis stimmt einfach nicht.
Code: [Select]
void setup(void) {
  Serial.begin(9600);
  float x = 33.0;
  x = x/10.0;
  x = x-3.0;
  x = x*10.0;
  Serial.println(x,10);
}

void loop(void)
{ }
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

agmue

Ergebnis UNO:
2.9999995231

Ergebnis Teensy mit double:
3.0000000000
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up