Hallo zusammen, ich habe ein "kleines" Problem mit Pointern und komme auch mit der Suche nicht dahinter: Ziel: Ich möchte die Daten eines Struct ins EEProm schreiben und vorher eine Prüfsumme über alle Bytes bilden indem ich jedes Byte des Stuct addiere und von der Summe noch das Komplement bilde. Das struct schaut vereinfacht so aus: ===================================== struct e2param_struct { unsigned int array1[6]; unsigned int array2[6]; unsigned int array3[6]; }; // müsste als 2 x 6 x 3 = 36 Byte lang sein Eine entsprechende Variable wurde deklariert: ============================================= extern struct e2param_struct E2Param; Nun möchte ich die 36 einzeln Bytes addieren indem ich den Zeiger auf das erste Element des struct setze und dann mittels Laufvariable i einen Offset auf den Zeiger addiere: ================================================ unsigned char i, j; j = 0; for (i = 0; i < 36; i++) { j += (unsigned char)*(&E2Param.array1[0] + i); }; und anschließend das Komplement bilden: ======================================= j ^= 0xff; Mein Problem scheint zu sein, dass (unsigned char)*(&E2Param.var1[0] + i) nicht jedes Byte des struct liefert sondern nur für i = 0 bis 17 das Low-Byte von array1[0..5], array2[0..5], array3[0..5] und dann noch 18 mal 0 Hat da jemand einen Tipp für mich? Danke & Gruß Jürgen
> j += (unsigned char)*(&E2Param.array1[0] + i); Der Term &E2Param.array1[0] + i wird für Objekte der Größe sizeof(int) berechnet - und mit i = 18 ist das letzte Element erreicht. Wenn du es so machen willst, dann musst du erst casten und dann +i rechnen: > j += *((unsigned char*)E2Param.array1 + i); Allerdings machst du damit einige Annahmen über das aussehen der struct im RAM, die nicht in jeder Architektur und bei jedem Compiler auch zutreffen müssen. z.B. nimmst du damit an, dass alle Elemente der struct direkt nacheinder ohne Lücken im RAM liegen - auf einem AVR mag das zutreffend sein, was auf einer 32Bit-Maschine aber passiert, sieht meist anders aus.
Hallo Jan, danke für deine Erläuterung und Hinweise - läuft jetzt. Gruß Jürgen
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.