Führende Nullen unterdrücken wenn == 0

OP #5301116
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.
#5301132
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
Gast #5301139
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
#5301208
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.
#5301235
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 von einem Moderator gelöscht.
Gast #5301269
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.
OP #5301299
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?
Persönliche Seite #5301336
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äß.
Gast #5301389
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.
Gast #5301405
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 von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren