Seite 1 von 1
Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 06.07.2010 22:40
von Kurzer
Hallo zusammen,
ich habe ein Problem mit Offset().
Bei einfachen Strukturen funktioniert das, aber wenn ich den offset eines Felds in einer "geUnionten" Struktur ermitteln möchte, dann geht das nicht.
Code: Alles auswählen
Structure Person
Vorname.s{10}
Nachname.s{10}
Alter.i
Schuhgroesse.i
EndStructure
Structure Arbeitnehmer
Gehalt.i
StundenProTag.i
StructureUnion
Persoenlich.Person
; irgend eine andere Struktur
; noch eine andere Struktur
EndStructureUnion
EndStructure
Debug OffsetOf(Person\Alter) ; Korrekt, ergibt 20, aber die Autovervollständigung funktioniert nicht
Debug OffsetOf(Arbeitnehmer\StundenProTag) ; Korrekt, ergibt 4, aber die Autovervollständigung funktioniert nicht
; Debug OffsetOf(Arbeitnehmer\Alter) ; geht nicht (Strukturfeld nicht gefunden: Alter)
; Debug OffsetOf(Arbeitnehmer\Person\Alter) ; geht nicht (Strukturfeld nicht gefunden: Person)
; Debug OffsetOf(Arbeitnehmer\Persoenlich\Alter) ; geht nicht (Syntaxfehler)
Ist das irgendwie lösbar oder hab ich nur was falsch verstanden?
Ich brauche in der Struktur Arbeitnehmer den offset von Alter
Es wundert mich übrigens auch, daß die Autovervollständigung nicht anspringt bei
OffsetOf(Arbeitnehmer\...
(habe dazu bereits einen Bugreport im engl. Forum gepostet)
Edit: Anfang.b und Ende.b habe ich aus dem Beispiel wieder entfernt, weil's Blödsinn war.
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 06.07.2010 23:14
von edel
Ist das irgendwie lösbar oder hab ich nur was falsch verstanden?
Ich brauche in der Struktur Arbeitnehmer den offset von Alter
Scheint so, denn "Alter" ist ja auch kein Member von "Arbeitnehmer" sondern von "Person"
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 06.07.2010 23:23
von cxAlex
Code: Alles auswählen
Structure Person
Vorname.s{10}
Nachname.s{10}
Alter.i
Schuhgroesse.i
EndStructure
Structure Arbeitnehmer
Gehalt.i
StundenProTag.i
StructureUnion
Anfang.b
Persoenlich.Person
Ende.b
EndStructureUnion
EndStructure
Debug OffsetOf(Arbeitnehmer\Persoenlich)+OffsetOf(Person\Alter)
Sieht korrekt aus und ich sehe keinen Grund es nicht so zu machen. Ob das andere ein PB Bug ist kann ich jetzt nicht sagen, in meinen Augen sollte es anders auch gehe.
Gruß, Alex
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 06.07.2010 23:30
von Kurzer
Aber das ist schon verwirrend, denn tatsächlich steht Alter an ja xter stelle eines Speicherbereichs, den ich (zumindest am Anfang der Zeile) mittels Arbeitnehmer anspreche. Diesen Wert kann man auch real ermitteln (siehe unten - Gurkenlösung)... nur eben nicht mit OffsetOf()
Das hier geht ja auch und hat mir den Eindruck vermittelt, ich könnte bei OffsetOf() genauso codieren:
Code: Alles auswählen
Define Horst.Arbeitnehmer
Horst\Persoenlich\Alter = 23
Debug Horst\Persoenlich\Alter
Nun muß ich folgende Gurkenlösung benutzen:
Code: Alles auswählen
Debug @Horst\Persoenlich\Alter - @Horst ; zeigt den korrekten Offset von 28 Bytes
Edit: da war Alex schneller als ich
Edit 2: Die Variable Ende.b in der Struktur im ersten Posting ist nonsense bzw. es ist richtig, daß sie ebenfalls 8 ergibt, da ja alle im StructureUnion-Bereich aufgeführten Felder an der selben Adresse beginnen.
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 07.07.2010 15:49
von a14xerus
die structureunion is iwie quatsch
anfang.b, ende.b und Persoenlich.Person stehen am selben speicherbereich :-/
Dazu ist Persoenlich.Person dann ja ein pointer, und dann ist ein zugriff auf .b Variablen an der gleichen Speicherstelle doch iwie sinnlos, oder?
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 07.07.2010 16:09
von Kurzer
zugegeben, das Anfang und Ende in meinem Beispiel oben ist etwas verwirrend, aber StructureUnion an sich ist nicht quatsch.
Ich brauche das, um auf einen (immer gleich großen) Memoryblock mit unterschiedlichen "Schablonen", also Structuren zuzugreifen.
Für mein aktuelles Projekt eine absolute Erleichterung, nur eben mit dem OffsetOf() hats dann nicht geklappt.
Es geht bei mir um einen Netzwerk-Sendebuffer, der immer den gleichen Header hat (vergleichbar mit Gehalt.i und StundenProTag.i) bei dem dann aber ab Speicherstelle X der Datenblock jeweils anders aufgebaut sein kann.
Dafür nutze ich dann verschiedene Structuren, die per StructureUnion in die Netzwerk-Bufferstruktur eingebunden sind.
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 07.07.2010 20:04
von Captn. Jinguji
Kurzer hat geschrieben:zugegeben, das Anfang und Ende in meinem Beispiel oben ist etwas verwirrend, aber StructureUnion an sich ist nicht quatsch.
Ich brauche das, um auf einen (immer gleich großen) Memoryblock mit unterschiedlichen "Schablonen", also Structuren zuzugreifen.
.
Ja, hmmm... warum denn offsetof(), wenn Du den Aufbau doch kennst ??
Du definierst einfach "n" structures jeweils der Größe des Blocks in den "n" Strukturen, die Du brauchst, klatscht die
allesamt in einer structure union übereinander und greifst dann über die jeweiligen Strukturelemente zu.
Habe ich mal für die Auswertung von SAP LAW Dateien gemacht, die haben auch so die Marotte, Stringzeilen
mit vom ersten/zweiten/dritten Zeilenelement abhängigen Strukturen zu verwenden.
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 07.07.2010 23:10
von Kurzer
Hmm ach so, Du meinst, daß ich in den 'n' verschiedneen Strukturen auch den Header immer wieder reinnehme, auch wenn der überall gleich ist?
Könnte man so machen. Danke für den Tipp.
Dennoch wäre es ein schönes Ding, wenn man OffsetOf() auch mit verbundenen Strukturen benutzen könnte.
Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?
Verfasst: 08.07.2010 06:15
von Captn. Jinguji
1) ja, genau
2) ja, genau

. Eigentlich wäre zu erwarten, dass es so funktioniert, wie Du es ursprünglich vorhattest.