Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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.
Zuletzt geändert von Kurzer am 07.07.2010 19:49, insgesamt 1-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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"
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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?
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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.
Ist das Kunst hier, oder kann das weg ?
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: Wie Offsetof() bei Struktir mit StructurUnion benutzen?

Beitrag von Captn. Jinguji »

1) ja, genau
2) ja, genau ;). Eigentlich wäre zu erwarten, dass es so funktioniert, wie Du es ursprünglich vorhattest.
Ist das Kunst hier, oder kann das weg ?
Antworten