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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren