Forum: PC-Programmierung verschiedene


von Leon (Gast)


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.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

mach dir mal Gedanken über den Betreff deines Beitrages, insbesondere ob 
du damit die von dir angestrebte Zielgruppe adressieren kannst.

von wendelsberg (Gast)


Lesenswert?

Leon schrieb:
> ich habe mehrere structs [in c], welche ich im eeprom speichern

Eeprom PC ?

wendelsberg

von Teo D. (teoderix)


Lesenswert?

wendelsberg schrieb:
> Eeprom PC ?

BIOS!

von S. R. (svenska)


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. :-)

von A. S. (Gast)


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.

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
Noch kein Account? Hier anmelden.