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