verschiedene

Gast #6505276
Lesenswert?
• ▲
▼
hallo liebe leut
ich habe mehrere structs [in c], welche ich im eeprom speichern möchte.
Jetzt habe ich bisher für jede structur eine neue Funktion gemacht.
z.B.
1
void writeParam(struct1 const* param, uint32 address)
2
{
3
  struct
4
  {
5
    uint16 checkSumme;
6
    uint16 free;
7
    struct1 param;
8
  }write;
9
  
10
  write.param = *param;
11
  write.free = 0xFFFF;
12
  write.checkSumme = calcChecksumme((uint8*)&write.param, sizeof(write.param));
13
  
14
  eepromWrite(adress, (uint8*)&write, sizeof(write))
15
}

gleiches für struct2, struct3 and struct4
Diese Structuren sind komplett unterschiedlich

Gibt es da einen weg, nur eine Funktion für verschiedene structuren zu 
benutzen?

Habe es versucht mit
1
void writeParam(void const* param, uint16 address)
Aber dann habe ich probleme mit der structur (write) in der funktion.
#6505339
Lesenswert?
• ▲
▼
Du musst sowohl den Zeiger auf die struct als auch die Länge der struct 
mit übergeben, dann kann deine Funktion die Inhalte übergeben.

Der Prototyp sieht dann so aus:
1
void writeParam(void* param, size_t size, uint32_t address);

Innerhalb von writeParam() darfst du dann natürlich nirgends mehr ein 
"struct1" oder so stehen haben. Das heißt, deine temporäre Struktur 
kannst du irgendwie so zusammenbauen:
1
void writeParam(void* param, size_t size, uint32 address)
2
{
3
  __attribute__((packed)) struct s_write
4
  {
5
    uint16 checkSumme;
6
    uint16 free;
7
    uint8_t param[];
8
  };
9

10
  size_t writesz = size + 4;
11
  struct s_write* write = (struct s_write*)alloca(writesz);
12
  
13
  memcpy(&write->param, param, size);
14
  write->free = 0xFFFF;
15
  write->checkSumme = calcChecksumme((uint8_t*)param, size);
16
  
17
  eepromWrite(adress, (uint8*)write, writesz)
18
}

Bugs sind meine, ich hab den Code hier im Forum geschrieben. Betrachte 
es als Ideengrundlage. :-)
Gast #6505966
Lesenswert?
• ▲
▼
Leon schrieb:
> write.param = *param;
>   write.free = 0xFFFF;
>   write.checkSumme = calcChecksumme((uint8*)&write.param,
> sizeof(write.param));
>
>   eepromWrite(adress, (uint8*)&write, sizeof(write))

Ich vermute Du möchtest malloc vermeiden. Dann mach dir Gedanken 
eepromWrite neu zu schreiben oder zu wrappen. Es macht wenig Sinn, ein 
Datenfeld unbekannter Größe an ein paar Bytes zu pappen. Übergibt die 
beiden Parameter einfach mit.

Antwort schreiben

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