Führende Nullen unterdrücken wenn == 0

OP #5301116
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.
@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
Gast
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
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.
@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.
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 von einem Moderator gelöscht.
Gast
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.
OP
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?
Persönliche Seite
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äß.
Gast
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.
Gast
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 von einem Moderator gelöscht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.