Guten Abend, ich habe zu einer fundamentalen Sache in der Sprache C zu folgendem Problem eine Frage: Ich habe eine Datenstruktur mit Variablen unterschiedlichen Typs und bilde damit mehrere Variablen. Jetzt möchte ich diese Variablen in ein EEPROM (internes EEPROM des ATMEGA8, aber das ist hier ohne Bedeutung) transferieren bzw. von dort laden. Dazu habe ich mir eine Funktion geschrieben, die genau ein Byte vom EEPROM lesen bzw. in das EEPROM schreiben kann. Meine Frage ist nun wie ich solch eine Struktur Byteweise übertragen kann, so dass ich mich nicht um die einzelnen Variablen kümmern muss? Also im wesentlich so etwas: for (n = 0; n < sizeof (struct FunctionVar); n++) { pZieladresse = EEPROM_Read_CHAR(EEPROMAdresse); pZieladresse++; EEPROMAdresse++; } Anbei mein Lösungsansatz etwas ausführlicher im Anhang, mit den zu erwartenden Warnings. Wahrscheinlich gehört das zu den C-Grundlagen, aber irgendwie steige ich jetzt da überhaupt nicht durch. Für eine Hilfestellung bedanke ich mich herzlich. Michael
:
Bearbeitet durch User
Michael schrieb: > Meine Frage ist nun wie ich solch eine Struktur Byteweise übertragen > kann, so dass ich mich nicht um die einzelnen Variablen kümmern muss? Bilde eine Union deiner Struktur mit einem Byte Array, was genau so groß ist, wie die Struktur selbst. (sizeof (struct FunctionVar)) Du kannst dann auf einzelne Bytes auf Byte Array in einem Loop zugreifen, so wie es vor hattest.
Spricht was gegen EEMEM und die schreib/update/read Befehle aus der eeprom.h?
Hannes schrieb: > Spricht was gegen EEMEM und die schreib/update/read Befehle aus der > eeprom.h? NIH!
In Zeile 1338 fehlt der Cast nach (unsigned char *):
1 | pZieladresse = (unsigned char *)&VAR_Kanal0; |
In Zeile 1343 fehlt die Dereferenzierung des Zielpointers:
1 | *pZieladresse = EEPROM_Read_CHAR(EEPROMAdresse); |
Echte C-Programmierer fassen die drei Anweisungen in der Schleife zu einer einzigen zusammen:
1 | for (n = 0; n < sizeof (struct FunctionVar); n++) |
2 | *pZieladresse++ = EEPROM_Read_CHAR(EEPROMAdresse++); |
Das entspricht dem gängigen Idiom
1 | for (...) |
2 | *y++ = *x++; |
für das Kopieren eines Speicherbereichs.
:
Bearbeitet durch Moderator
Michael schrieb: > Jetzt möchte ich diese Variablen in ein EEPROM (internes EEPROM des > ATMEGA8, aber das ist hier ohne Bedeutung) transferieren bzw. von dort > laden. Wenn Du nur einzelene Elemente der Struct aus dem EEPROM laden möchstest, also nicht die gesamte Struct in einem Rutsch, hilft das Macro
1 | size_t offsetof(type, member); |
aus dem System-Header stddef.h. Grüße, Volker
Yalu X. schrieb: > Echte C-Programmierer ..... Auf diesem Weg bin ich, aber eben noch nicht ganz bei "Echten Programmierer" angelangt ;-) Herzlichen Dank für die Tip-Top Lösung. Die Übertragung funktioniert perfekt. Viele Grüße Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.