Forum: Mikrocontroller und Digitale Elektronik Führende Nullen unterdrücken wenn == 0


von Jan H. (janiiix3)


Lesenswert?

Moinsen,

Ist es irgendwie möglich ohne mehrere "if´s" die führenden nullen zu 
unterdrücken oder raus zu rechnen?
1
    buffer[4] = (((uart.byteRx / 10000) % 10) + '0');
2
    buffer[5] = (((uart.byteRx / 1000)  % 10) + '0');
3
    buffer[6] = (((uart.byteRx / 100)  % 10) + '0');
4
    buffer[7] = (((uart.byteRx / 10)  % 10) + '0');
5
    buffer[8] = ((uart.byteRx % 10)        + '0');
Sieht auf dem Display ein wenig "doof" aus.

von Stefan P. (form)


Lesenswert?

Schau Dir mal itoa oder sprintf an.

von Thomas E. (thomase)


Lesenswert?

1
for(char i = 4; i < 9; i++) if(buffer[i] == '0') buffer[i] = ' '; else break;

von Falk B. (falk)


Lesenswert?

@Jan H. (janiiix3)

>Ist es irgendwie möglich ohne mehrere "if´s" die führenden nullen zu
>unterdrücken oder raus zu rechnen?

Sicher.

>    buffer[4] = (((uart.byteRx / 10000) % 10) + '0');
>    buffer[5] = (((uart.byteRx / 1000)  % 10) + '0');
>    buffer[6] = (((uart.byteRx / 100)  % 10) + '0');
>    buffer[7] = (((uart.byteRx / 10)  % 10) + '0');
>    buffer[8] = ((uart.byteRx % 10)        + '0');
>Sieht auf dem Display ein wenig "doof" aus.

Nicht nur im Display, auch im Quelltext. Schon mal was von Schleifen 
gehört?

https://www.mikrocontroller.net/articles/Festkommaarithmetik#Ergebnis_ausgeben

von Vril (Gast)


Lesenswert?

Jan H. schrieb:

> buffer[4] = (((uart.byteRx / 10000) % 10) + '0');
>     buffer[5] = (((uart.byteRx / 1000)  % 10) + '0');
>     buffer[6] = (((uart.byteRx / 100)  % 10) + '0');
>     buffer[7] = (((uart.byteRx / 10)  % 10) + '0');
>     buffer[8] = ((uart.byteRx % 10)        + '0');

das kann nur das Ergebnis folgender learning/work-chain sein:

Zuerst YouTube Filmchen:
Film 1: Unboxing Büchersendung " Programmieren lernen, leicht gemacht "
Film 2: was ein guter Programmierer braucht ist: Windows + Netbeans + 
Eclipse
Film 3: Hello World
Film 4: Strings & Arrays
Film 5: warum Linux besser ist
Film 6: ich muss nix lernen, es gibt für alle probs ne eigene 
Distribution
Step 7: grübel, grübel
Step 8: ich frage mal im Forum nach

von Der Andere (Gast)


Lesenswert?

Jan H. schrieb:
> byteRx

Interessant. Wie schaffst du es eigentlich in ein "Byte"! eine 5 
stellige Dezimalzahl zu codieren?

So viel zum Thema sinnvolle Variablennamen benutzen
;)

von (prx) A. K. (prx)


Lesenswert?

Jan H. schrieb:
> Ist es irgendwie möglich ohne mehrere "if´s" die führenden nullen zu
> unterdrücken oder raus zu rechnen?

Wenn du den Puffer per Schleife von hinten nach vorne füllst, dann 
kommst du mit einer Bedingung aus. Und wenn du dann auch noch die 
div/ldiv Funktionen verwendest, dann musst du auch nur 1x dividieren.

: Bearbeitet durch User
von Jan H. (janiiix3)


Lesenswert?

A. K. schrieb:
> div/ldiv Funktionen verwendest, dann musst du auch nur 1x dividieren.

Sorry. Ich verstehe nicht. Wie meinst du das?

von (prx) A. K. (prx)


Lesenswert?

Jan H. schrieb:
> A. K. schrieb:
>> div/ldiv Funktionen verwendest, dann musst du auch nur 1x dividieren.
>
> Sorry. Ich verstehe nicht. Wie meinst du das?

Diese Lib-Funktion liefert in einem Aufwasch Quotient und Rest. Also 
sinngemäss:
1
   do {
2
     div_t qr = div(n, 10);
3
     buf[--i] = '0' + qr.rem;
4
     n = qr.quot;
5
   } while (n);

von Falk B. (falk)


Lesenswert?

@Jan H. (janiiix3)

>> div/ldiv Funktionen verwendest, dann musst du auch nur 1x dividieren.

>Sorry. Ich verstehe nicht. Wie meinst du das?

Es gib im avr gcc eine Funktion, welche eine Ganzzahldivision berechnet 
und sowohl das Ergebnis als auch den Rest zurückliefert. Das spart die 
doppelte Berechnung der Division und Modulo-Operation. Ist aber 
nebensächlich, wenn man nicht 1 Million Zahlen / Sekunde umrechnen will.

von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> Es gib im avr gcc eine Funktion,

Die gibts nicht nur im GCC, sondern im Standard.
Und sie spart u.U. nicht nur Zeit sondern auch Platz.

: Bearbeitet durch User
von Jan H. (janiiix3)


Lesenswert?

A. K. schrieb:
> do {
>      div_t qr = div(n, 10);
>      buf[--i] = '0' + qr.rem;
>      n = qr.quot;
>    } while (n);

Stehe gerade ein bisschen auf dem Schlauch "Mathe".. Könntest du mir 
evtl. noch ein Beispiel liefern?

von Michael B. (laberkopp)


Lesenswert?

Jan H. schrieb:
> Ist es irgendwie möglich ohne mehrere "if´s" die führenden nullen zu
> unterdrücken oder raus zu rechnen?

Die Frage ist, ob du da Leerzeichen willst oder die Zahl nach links 
rücken soll.

Der Andere schrieb:
> Interessant. Wie schaffst du es eigentlich in ein "Byte"! eine 5
> stellige Dezimalzahl zu codieren?

Würde mich auch wundern.

Ich hatte in diesem Forum doch mal eine schnelle ltoa Funktion mit 
Unterdrückung führender Nullen gepostet...

Beitrag #5301237 wurde vom Autor gelöscht.
von (prx) A. K. (prx)


Lesenswert?

Jan H. schrieb:
> Stehe gerade ein bisschen auf dem Schlauch "Mathe".. Könntest du mir
> evtl. noch ein Beispiel liefern?

https://www.gut-erklaert.de/mathematik/dividieren-teilen-klasse-2.html

von Reiner_Gast (Gast)


Lesenswert?

Jan H. schrieb:
> Ist es irgendwie möglich ohne mehrere "if´s" die führenden nullen zu
> unterdrücken oder raus zu rechnen?

Eine Sprintf Anweisung kann hier helfen...

siehe auch.... http://www.cplusplus.com/reference/cstdio/printf/

von Jan H. (janiiix3)


Lesenswert?

Michael B. schrieb:
> Jan H. schrieb:
>> Ist es irgendwie möglich ohne mehrere "if´s" die führenden nullen zu
>> unterdrücken oder raus zu rechnen?
>
> Die Frage ist, ob du da Leerzeichen willst oder die Zahl nach links
> rücken soll.

Das würde doch unnötig groß werden das Programm..

von Der Andere (Gast)


Lesenswert?

Jan H. schrieb:
> Das würde doch unnötig groß werden das Programm..

Diese Gegenfrage verstehe ich jetzt überhapt nicht.

Es gibt keinen Rabatt für ungenutzen Flash Speicher.
Wohl aber (berechtigte) Kritik wenn im Display dann Zahlen hin und her 
springen oder Ziffern gleicher Wertigkeit bei mehrzeiligen Ausgaben 
nicht untereinander stehen.

Es ist dein Projekt, wir wissen nicht wie deine Anzeige aussehen soll. 
Michael hat nur die richtige und wichtige Anmerkung gemacht ob die 
führenden Nullen einfach wegfallen, oder durch Blanks ersetzt werden 
sollen.

von Jan H. (janiiix3)


Lesenswert?

Der Andere schrieb:
> Es ist dein Projekt, wir wissen nicht wie deine Anzeige aussehen soll.
> Michael hat nur die richtige und wichtige Anmerkung gemacht ob die
> führenden Nullen einfach wegfallen, oder durch Blanks ersetzt werden
> sollen

Ist ja richtig. Wie würdet ihr das denn lösen, wenn ihr vor diesem 
Problem stehen solltet.. Leerzeichen oder die Zahlen hin und her 
kopieren bzw. verschieben?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. K. schrieb:
> Jan H. schrieb:
>> A. K. schrieb:
>>> div/ldiv Funktionen verwendest, dann musst du auch nur 1x dividieren.
>>
>> Sorry. Ich verstehe nicht. Wie meinst du das?
>
> Diese Lib-Funktion liefert in einem Aufwasch Quotient und Rest. Also
> sinngemäss:
>
1
>    do {
2
>      div_t qr = div(n, 10);
3
>      buf[--i] = '0' + qr.rem;
4
>      n = qr.quot;
5
>    } while (n);
6
>

Macht ein optimierender COmpiler ohnehin.  Solche Verrenkungen sind 
nicht mehr zeitgemäß.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jan H. schrieb:
> Wie würdet ihr das denn lösen, wenn ihr vor diesem
> Problem stehen solltet.. Leerzeichen oder die Zahlen hin und her
> kopieren bzw. verschieben?

Die Anwort steht doch bereits im 1. Post.

itoa macht genau das.

von Jan H. (janiiix3)


Lesenswert?

itoa erzeugt doch einen sehr großen Overhead oder

von Michael B. (laberkopp)


Lesenswert?

Jan H. schrieb:
> itoa erzeugt doch einen sehr großen Overhead oder

Ungefähr 1/100 des ebenfalls vorgeschlagenen sprintf.

von StefG (Gast)


Lesenswert?

Also beim Management bringt es nichts, wenn man führende Nullen durch 
Leerzeichen ersetzt ;-)

von Vril (Gast)


Lesenswert?

welcher C Standard ist jetzt nochmal itoa ?

von Der Andere (Gast)


Lesenswert?

Vril schrieb:
> welcher C Standard ist jetzt nochmal itoa ?

Wie sagt Wikipedia so schön:
"The itoa (integer to ASCII) function is a widespread non-standard 
extension to the standard C programming language. It cannot be portably 
used, as it is not defined in any of the C language standards; however, 
compilers often provide it through the header <stdlib.h> while in 
non-conforming mode, because it is a logical counterpart to the standard 
library function atoi."

Da man bei der Frage aber davon ausgehen kann daß der TO keine 
universelle Bibliothek schreibt die auf 5 Rechnersystemen portabel und 
mit 20 verschiedenen Compilern compilierbat sein muss ist der Hinweis 
auf itoa() so es existiert wohl eher nicht das Problem.

von Brummbär (Gast)


Lesenswert?

StefG schrieb:
> Leerzeichen

Du meinst Leerstellen. Oder Lehrstellen?

von A. S. (Gast)


Lesenswert?

Anbei der Quellcode eines Compilers hier.

der TO kann ja das ganze in MyItoa umbenennen, Radix durch 10 ersetzen 
und hat dann was er sucht.
1
char *itoa(int val, char *s, int radix)
2
{
3
unsigned int u;
4
char buf[1 + sizeof(val) * 8 + 1];
5
char *p;
6
int sign = 0;
7
8
  if ((radix < 2) || (radix > 36)) {
9
    s[0] = 0;
10
    return (s);
11
  }
12
13
  u = val;        /* assume positive */
14
  buf[sizeof(buf) - 1] = 0;
15
  p = &buf[sizeof(buf) - 2];    /* last character position */
16
  if (radix == 10 && (int) u < 0) {
17
    sign++;
18
    u = -u;
19
  }
20
  while (1) {
21
    *p = (u % radix) + '0';
22
    if (*p > '9')  *p += 'a'-'0'-10;
23
    if ((u /= radix) == 0)  break;
24
    p--;
25
  }
26
  if (sign)  *--p = '-';
27
  return (memcpy(s,p,(size_t)(&buf[sizeof(buf)] - p)));
28
}

Jan H. schrieb:
> ohne mehrere "if´s"

Uups... selbst ohne radix bleiben noch 4ifs...

OK, sign braucht er nicht, ... bleiben 2 ifs.

Mmh, wenn ifs bei ihm so teuer sind, vielleicht ?: stattdessen?

Und dann noch Stackspeicher und memcpy .....

Beitrag #5301439 wurde vom Autor gelöscht.
von hal9000 (Gast)


Lesenswert?

Jaja
das kann jeder taschenrechner unsere politiker- und unsere wirtschaft 
aber nicht

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jan H. schrieb:
> itoa erzeugt doch einen sehr großen Overhead oder

Sagt wer? Und für welche Toolchain / Architektur.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.