www.mikrocontroller.net

Forum: Compiler & IDEs sizeof Konfusion


Autor: Sebastian Schildt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe gerade massive Probleme mit dem sizeof Operator. Ich vermute
mal wieder das übliche Brett vorm Kopf, aber irgendwie bekomme ich
nicht weiter.

Ich habe mehrere Objekte gleichen Typs hintereinander im Speicher. IM
Prinzip wie ein Array, nur das ich die Länge nicht kenne. Also gibt es
zu jeder Liste ein Abschlusselement das ich erkennen kann. Prinzipiell
gehe ich also so durch die Liste )element ist ein Zeiger auf einen
struct vom Typ elementType)

while (element != NULL) {
   machwas_mit(element);
   element+=sizeof(struct elemtType);
}

Ich wunder mich schon die ganze Zeit warum er Einträge zu
"überspringen" scheint bis ich folgendes versucht habe:

PORTC=sizeof(struct rePARTSTransition);
currentList=currentList+sizeof(struct rePARTSTransition);

Die Zeilen stehen so direkt hintereinander im Source. Der Assembler
dazu sagt:

---- d:\atmel\reparts\fsm.c
-----------------------------------------------------------------------
34:            PORTC=sizeof(struct rePARTSTransition);
+0000024C:   E083        LDI     R24,0x03         Load immediate
---- No Source
------------------------------------------------------------------------ 
------------
+0000024D:   BB85        OUT     0x15,R24         Out to I/O location
---- d:\atmel\reparts\fsm.c
-----------------------------------------------------------------------
35:            currentList=currentList+sizeof(struct rePARTSTransition);
+0000024E:   9639        ADIW    R30,0x09         Add immediate to
word

Warum addiert er beim 2. mal 9? 3 wäre richtig, oder sagen wir mal 3
erwarte ich.

Hilfe!

MfG

Sebastian

Autor: Sebastian Schildt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein kleiner Nachtrag: Auch wenn ich

currentList=currentList+3;

schreibe addiert er 9, d.h. nach
+0000024E:   9639        ADIW    R30,0x09         Add immediate to
word

sehe ich dann auch dass sich der Pointer um 9 Byte statt 3 verschoben
hat, bei

currentList=currentList+12;

addiert er 0x24
+0000024E:   9639        ADIW    R30,0x24         Add immediate to
word

Ich muss allerdings auch sagen, dass mir der generierte Assemblercode
nicht 100% klar ist wo er da so rumspringt (bin das nicht so gewohnt
den C Code mit ASM zu vergleichen).

Ich werde mir das morgen nochmal genauer anschauen und evtl. versuchen
mal nen kleineren Testcase zu bauen, aber für heute ist erst mal
Schluss.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da "element" vein Void-Pointer ist, addiert die Pointerarithmetik hier


   element += sizeof (struct elemtType);

nicht n Bytes, sondern n * die Größe eines Elementes.

Schröbest Du also

   element++;

dann sollte sich die Angelegenheit so verhalten wie erwartet.

Anscheinend ist Dein struct elementType ziemlich klein (3 Bytes?), das
würde jedenfalls das Verschieben des Pointers um 9 statt um 3 Bytes
erklären.

Autor: Sebastian Schildt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh kacke!

Notiz an mich: Nochmal durch den K&R. Solange bis das sitzt :D

Danke mann! Was ich mir schon wieder alles für Theorien zurecht gelegt
habe! Ich hätte das bestimmt in 2 Wochen nicht gefunden. Dabei ist es
nicht mal das Problem, das ich nicht weiß wie das mit den Pointern
funktioniert, ich scheine nur gerade mein Wissen komplett ignoriert zu
haben :)

Und ja, das struct ist nur 3 Byte groß, das haste richtig erkannt :)

MfG

Sebastian

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann jedem passieren. Manchmal ist die Wand halt doch härter als der
Kopf; ich hab' sowas auch manchmal.
Freut mich, Dir helfen gekonnt zu haben.

(und ein Kompliment an Dich für die so eindeutig formulierte Frage)

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.