Wert > 255 in Array

Gast #3170023
Hallo,

wenn ich ein

uint8_t inhalt[8][8];

Array anlege.

Ich habe z.b. einen String Name in inhalt[0]
den Vornamen in inhalt[1]

Funktioniert soweit.

Jetzt möchte ich z.b. einen Betrag in inhalt[2] ablegen

z.b. 123,67 €

später möchte ich dann 0,47€ davon abziehen, wie soll ich vorgehen um 
den Betrag im Array zu speichern?

die Cent in inhalt[2][0]
die Euro in inhalt[2][1]
?

wenn ich aber Euro=inhalt[2][0]+inhalt[2][1] mache habe ich ja ein 
problem beim zurückschreiben. Wie gehe ich da am besten vor?
Gast #3170036
Mir ist schon klar das das uint8 nur bis FF geht.

Das Problem ist ich bekomme die Daten seriell im format 0xFF 0xFF 0xFF 
0xFF ...

kann ich 0xFF 0xFF in ein uint16 0xFFFF umwandeln?
Gast #3170045
1
union {
2
 uint8_t 8b[2];
3
 uint16_t 16b;
4
} blub;
5

6
blub.8b[0]  = 0xFF;
7
blub.8b[0]  = 0xFF;
8

9
printf("%d", blub.16b);

Allerdings musst Du jetzt noch sämtlichen Dummfug in nachfolgenden 
Postings ignorieren können, der Dir sagt warum das böse ist.
Gast #3170049
Egal schrieb:
> Allerdings musst Du jetzt noch sämtlichen Dummfug in nachfolgenden
> Postings ignorieren können, der Dir sagt warum das böse ist.

und hier ist er schon.

verwende kein Union - es bringt keinen Vorteil und den Nachteil das das 
Ergebnis von der Plattform und dem Compiler abhängt.
#3170057
Wenn du Zeit hast, sie getrennt in ein Array zu schieben, kannst du sie 
auch gleich zusammenführen:

Mach ein Array mit Fließkommadatentyp und schreib dort rein 
C(n)=a+b/100, wobei a die Ganzzahl und b die Nachkommazahl im INT-Format 
sind, die du beim Empfang in einen Zwischenpuffer bzw. Puffer-Array 
schreibst... Dann kannst du mit deinen Beträgen auch weiterrechnen, wie 
es dir beliebt...
#3170068
Michael Sch. schrieb:
> Mach ein Array mit Fließkommadatentyp und schreib dort rein
> C(n)=a+b/100, wobei a die Ganzzahl und b die Nachkommazahl im INT-Format
> sind

Gleitkomma ist hier reichlich unangebracht und macht nur Ärger. 
Geldbeträge sind DER klassische Anwendungsfall für Festkomma. Man nimmt 
einen Integer-Typ und betrachtet den Inhalt als Cent-Betrag.
Gast #3170158
Hallo,

ok, ahbe es hinbekommen, klar wird dann in Cent gerechnet

zurück umwandeln mach ich mit:

inhalt[2][0]=(uint8_t)Betrag;
inhalt[2][1]=(uint8_t)(Betrag >> 8);

Danke
Gast #3173098
Das ist aber alles mehr als umständlich...
1
struct inhalt_t {
2
    char[8] Name;
3
    char[8] vorname;
4
    uint16_t betrag;
5
    // weitere Felder
6
}
halte ich fürs wesentlich eleganter, falls ich richtig verstehe was du 
da vorhast.

So beschreibst du aber nur den Datentyp, die tatsächliche Struktur im 
Speicher wirds dann mit:
1
struct inhalt_t inhalt;

Dann schreibst du einzelne Zeichen in den strings so:
1
inhalt.Name[index] = whatever;
Dran denken, das die string-Funktionen der Standardbibliothek 
NULL-terminierte strings erwarten!

Der Betrag ist dann wie oben erläutert so zu erreichen:
1
inhalt.betrag = foo;
2

3
//oder auch so falls die beiden bytes nacheinander ankommen
4
extern uint8_t foo, bar;
5
inhalt.betrag = (uint16_t) foo;
6
inhalt.betrag |= (uint16_t) (bar << 8);
Gast #3173113
Benedikt schrieb:
> Das ist aber alles mehr als umständlich...
> struct inhalt_t {
>    char[8] Name;
>    char[8] vorname;
>    uint16_t betrag;
>    // weitere Felder
>}
> halte ich fürs wesentlich eleganter, falls ich richtig verstehe was du
> da vorhast.

und wieder nicht portabel. Nicht mal der Compiler muss es richtig 
umsetzen, weil das verhalten nicht definiert ist. Und auf Big/Little 
Endian liefert es auch was anders als erwartet.

Union sind nicht dafür gemacht und sollten auch nicht dafür missbraucht 
werden!
Gast #3173126
Peter II schrieb:
> Benedikt schrieb:
>> Das ist aber alles mehr als umständlich...
>> struct inhalt_t {
>>    char[8] Name;
>>    char[8] vorname;
>>    uint16_t betrag;
>>    // weitere Felder
>>}
>> halte ich fürs wesentlich eleganter, falls ich richtig verstehe was du
>> da vorhast.
>
> und wieder nicht portabel. Nicht mal der Compiler muss es richtig
> umsetzen, weil das verhalten nicht definiert ist. Und auf Big/Little
> Endian liefert es auch was anders als erwartet.
>
> Union sind nicht dafür gemacht und sollten auch nicht dafür missbraucht
> werden!

Das ist ja auch keine union! Mein Code wäre sicher problematisch wenn er 
einfach ein
1
(uint8_t*) &inhalt
 macht und dann alles in einem Schwung irgendwo hin sendet (wg dem 
uint16_t).
Ohne meintest du was anderes?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 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.