Struct abspeichern

Gast #263185
Lesenswert?
• ▲
▼
Guten Abend !

Ich habe ein kleines Problem, und zwar habe ich eine Struktur die aus
diversen Bitfeldern und einem long int besteht und die 8 Byte lange ist
(sizeof). Wie kann ich auf die 8 einzelnen Bytes zugreifen?
Hatte mir überlegt nen Zeiger auf den Anfang der Struktur zu legen und
immer das vom Zeiger addressierte Byte abzuspeichern. Das drauffolgende
Byte  mittels zeiger+sizeof(unsigned char) genauso adressieren.
Geht sowas?
Kann mir jemand da mal mit nem C Codefragment helfen?

Danke

Danni
Gast #263186
Lesenswert?
• ▲
▼
Hallo Danni,

ich habe einmal kurz ein Codefragment geschrieben. Hoffe, dass keine
Fehler enthalten sind.
Prinzipiell kannst Du aber auch eine Union verwenden.

struct
{
  unsigned int Bit0   : 1;
  unsigned int Bit1_5 : 4;
  long LongVariable;
} Variable;

unsigned char* PointerToLong;

// Pointer auf Long Variable setzen
PointerToLong = &Variable.LongVariable;

// Zugriff auf die einzelnen Elemente
Byte0 = PointerToLong[0];
Byte1 = PointerToLong[1];
Gast #263187
Lesenswert?
• ▲
▼
Abend !

Danke für die Hilfe aber habe mich leider etwas znglücklich ausgedrückt
und zwar meine ich mal anls Beispiel eine Struktur:

struct
{
unsigned int x:3
unsigned int y:5

*
*

long int k;
} name;

Nehmen wir mal an die Struktur ist so groß, dass diese 8 Byte im
Speicher belegt. Wie bekomme ich Byte0, Byte1 ...  Byte7 einzeln
ausgelesen, so dass ich diese byteweise in ein i2c EEPROM packen kann?
Gast #263189
Lesenswert?
• ▲
▼
Hallo,

also probieren wir es noch einmal.
Ich habe sowieso einen cast vergessen.
Hoffentlich habe ich Dein Problem jetzt verstanden.


unsigned char* PointerToStruct;
unsigned charZiel[8];

PointerToStruct = (unsigned char)&name;

for(int i=0; i<8; i++)
  Ziel[i] = *PointerToStruct++;
Gast #263192
Lesenswert?
• ▲
▼
Danni,
definiere dir eine union, die aus deiner Struktur und einem gleich
grossen byte array besteht und fertig.

typedef union
{
   struct
   {
      unsigned int x:3
      unsigned int y:5
      *
      *
      long int k;
   } name;

   unsigned char bytes[8];
} myUnion;

Der Rest ist klar oder (C-Grundlagen).
#263195
Lesenswert?
• ▲
▼
kannst Du auch.
Du kannst dann trotzdem eine union verwenden:

void WriteToEEprom( struct irgendwas* What )
{
  union {
    struct irgendwas Original;
    unsigned char Bytes[ sizeof( struct irgendwas ) ]
  } *Wandler;

  Wandler = &What;

  for( i = 0; i < sizeof( irgendwas ); ++i )
    WriteByteToEEprom( Wandler->Bytes[i] );
}

Hmm. Wenn ich mir das so anschaue, ist wahrscheinlich
die cast-Loesung doch einfacher:

void WriteToEEprom( struct irgendwas* What )
{
  for( i = 0; i < sizeof( irgendwas ); ++i )
    WriteByteToEEprom( ((unsigned char*)What)[i] );
}
Persönliche Seite #263199
Lesenswert?
• ▲
▼
Hi

es steht nichtmal was von AVR in diesem Thread :-) Und
eeprom_write_block hilft dir auch nur für interne EEPROM der AVRs. Wenn
du ein externes EEPROM nutzen willst brauchts halt einen eigenen Code.
Und da muss Danni wissen wie er eine Struktur als Array von chars
behandeln kann. Und genau darum ging es hier. Mir (und aller
Wahrscheinlichkeit nach auch dir) ist natürlich klar das man da einfach
hingeht und sowas
1
//Schreibt einen Datenblock ab src mit Länge length ins EEPROM ab dst
2
bool eepromWriteBlock(void * src, void * dst, size_t length)
3
{
4
    uint8_t * lsrc = src;    
5
    uint8_t * ldst = dst;    
6
    bool res = true;
7

8
    for(size_t i = 0; i < length; i++)
9
    {
10
        res = res && eepromWriteUInt8(src++, dst++);
11
    }
12

13
    return res;
14
}
15

16
void foo(void)
17
{
18
    if(false == eepromWriteBlock(&someGlobalStruct,
19
                                 &structEEPROMLocation,
20
                                 sizeof(someGlobalStruct));
21
    {
22
        printf("The EEPROM .....")
23
    }
24
}

schreibt. Aber ob das für einen Anfänger als Antwort ideal ist?

Matthias

Antwort schreiben

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