Problem mit Pointern

Gast #1532571
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.