Eigenen Datentyp definieren

Gast #220724
Lesenswert?
• ▲
▼
Hallo.
Ich möchte meine eigene Struktur herstellen um ein Datum zu speichern.
dazu möchte ich folgendes kominieren:

Datum: 27.08.05

Tag:   27    -> 5 Bits
Monat: 08    -> 4 Bits
Jahr:  05    -> 4 bits (höchtes jahr: 2016)
Zeit:  2     -> 3 Bits (1 = 00:00 Uhr; 2 = 03:00 Ihr; 3 = 06:00....)

das Ganze wären dann 2 Bytes. aber wie mach ich das ?

quasi so in der art:
struct {
Bit[5] Tag;
Bit[4] Monat;
...
} time;
Gast #220726
Lesenswert?
• ▲
▼
An ne Union hab ich auch scon gedacht nur wie soll ich n halbes byte
vergeben?
Ich kann ja nicht schreiben

struct{
halbes_byte Tag;
...
}typ;

wie kann ich das mit einer Union machen ? Da muss ich do ch genauso ne
Struct definieren.
Kann ich das nicht irgendwie so machen, dann ich später über
1
Datum.Tag = 10;

zugreifen kann?
Gast #220727
Lesenswert?
• ▲
▼
Diese Bit-Knauserei spart Dir zwar 2 Bytes SRAM ein, kostet Dich aber
Unmengen an Flash bei jedem Zusammenbasteln und Auseinanderklamüsern
fürs Shiften, UNDieren und VerODERn.

Schau Dir einfach mal den erzeugten Assembler an, dann wird Dir schnell
übel werden.

Nimm also besser für die 4 Variablen auch 4 Bytes.

C unterstützt zwar Bitfelder, aber kaum einer benutzt sie, sind einfach
zu teuer in Bezug auf Code und CPU-Zeit.


Peter
Gast #220728
Lesenswert?
• ▲
▼
Hallo Peter.
esgeht mir nicht um die SRAM sondern um den EEPROM speicher des
Mega16s. Ich hab nur 512 bytes und da müssen möglichst viele messwerte
reinpassen sonst muss man jeden Tag die Daten auf den PC laden. Aus
platzgründen bekomm ich leider kein 2. EEPROM speicher / Flash auf mein
"Brett"
Gast #220731
Lesenswert?
• ▲
▼
"wiso dann uint_16_"

Das ist eben die Syntax, irgendeinen Typ muß jede Variable haben,
wichtig ist hier aber nur, was hinter dem ":" steht.


Peter

P.S.:
Man kann auch Daten im Flash speichern (SPM).
Beim Nutzen des EEPROM, unbedingt die Brownout-Fuse setzen !
Gast #220732
Lesenswert?
• ▲
▼
> C unterstützt zwar Bitfelder, aber kaum einer benutzt sie, sind
> einfach zu teuer in Bezug auf Code und CPU-Zeit.
Das trifft aber nur für Prozessoren zu, die ihren Speicher nicht
bitweise adressieren können! (Zugegeben, das dürfte die Mehrheit sein).
Mit "boolschen" Bitvariablen kann der entsprechende Prozessor mind.
genauso schnell arbeiten wie mit int-Werten (Prozessorbreite!) und hat
dabei den Vorteil des geringeren Speicherbedarfs für diese Variablen.

> "wiso dann uint_16_"
"korrekter" wäre int(!), da ANSI/ISO(?)-C das so verlangt.

----, (QuadDash).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.