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.