Forum: Compiler & IDEs Problem mit Pointern


von Jürgen (Gast)


Lesenswert?

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

von Jan M. (mueschel)


Lesenswert?

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

von Jürgen (Gast)


Lesenswert?

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