Forum: PC-Programmierung verschiedene


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Leon (Gast)


Bewertung
-5 lesenswert
nicht 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)


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

von wendelsberg (Gast)


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

Eeprom PC ?

wendelsberg

von Teo D. (teoderix)


Bewertung
0 lesenswert
nicht lesenswert
wendelsberg schrieb:
> Eeprom PC ?

BIOS!

von S. R. (svenska)


Bewertung
1 lesenswert
nicht 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. (achs)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.