mikrocontroller.net

Forum: Compiler & IDEs Problem mit Pointern


Autor: Jürgen (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jan,

danke für deine Erläuterung und Hinweise - läuft jetzt.

Gruß
Jürgen

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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