Moin Moin.
Leider geht deine Erklärung total an meinem Anliegen vorbei. Und die Antwort findet man leider auch nicht in der Hilfe.
Es geht mir nicht direkt darum wie man die StructureUnion nutzt, auch hat es nicht mit "gleichzeitig" zu tun (auch wenn man über Threads ja schon gleichzeitig darauf zugreifen kann).
Ich habe versucht mit der Erklärung und vor allen den Fragen heraus zu bekommen, wo die und wie die Daten gespeichert werden. Wo ihre "Bytepositionen" sind. Wie ich ganz zum Schluß erkläre, verstehe ich diese Art von Struktur auch noch nicht ganz (Speichertechnisch) und damit wie man sie nutzt. Auch wenn ich schon etwas vermute, mal noch etwas Code aus meinen "Gedankengängen" der Vergangenheit.
Code: Alles auswählen
Debug "ohne StructureUnion:"
Structure test2
var1.b
var2.b
varA.b
varB.b
varC.b
var3.b
var4.b
EndStructure
poo2.test2
poo2\var1 = 1
poo2\var2 = 2
poo2\varA = 11
poo2\varB = 12
poo2\varC = 13
poo2\var3 = 3
poo2\var4 = 4
Debug "@poo2 = " + Str(@poo2)
For i = 0 To 6
Debug "adresse = " + Str(@poo2+i) + " Inhalt = " + Str( PeekB(@poo2+i) )
Next i
Debug "sizeOf(poo2) = " + Str(SizeOf(poo2))
Debug "mit StructureUnion:"
Structure test
var1.b
var2.b
StructureUnion
varA.b
varB.b
varC.b
EndStructureUnion
var3.b
var4.b
EndStructure
poo.test
poo\var1 = 1
poo\var2 = 2
poo\varA = 11
poo\varB = 12
poo\varC = 13
poo\var3 = 3
poo\var4 = 4
Debug "@poo = " + Str(@poo)
For i = 0 To 6
Debug "adresse = " + Str(@poo+i) + " Inhalt = " + Str( PeekB(@poo+i) )
Next i
Debug "sizeOf(poo) = " + Str(SizeOf(poo))
Der Überschaubarkeit wegen, habe ich nur "Byte" als Variablentyp genommen.
Ergebnis bei mir:
[02:03:39] ohne StructureUnion:
[02:03:39] @poo2 = 4394684
[02:03:39] adresse = 4394684 Inhalt = 1
[02:03:39] adresse = 4394685 Inhalt = 2
[02:03:39] adresse = 4394686 Inhalt = 11
[02:03:39] adresse = 4394687 Inhalt = 12
[02:03:39] adresse = 4394688 Inhalt = 13
[02:03:39] adresse = 4394689 Inhalt = 3
[02:03:39] adresse = 4394690 Inhalt = 4
[02:03:39] sizeOf(poo2) = 7
[02:03:39] mit StructureUnion:
[02:03:39] @poo = 4394692
[02:03:39] adresse = 4394692 Inhalt = 1
[02:03:39] adresse = 4394693 Inhalt = 2
[02:03:39] adresse = 4394694 Inhalt = 13
[02:03:39] adresse = 4394695 Inhalt = 3
[02:03:39] adresse = 4394696 Inhalt = 4
[02:03:39] adresse = 4394697 Inhalt = 0
[02:03:39] adresse = 4394698 Inhalt = 0
[02:03:39] sizeOf(poo) = 5
Beide Testdurchläufe machen im Grunde das selbige, einzig die Positionen wo PB / das System (wie auch immer?) die Daten ablegt sind unterschiedlich. Ohne StructureUnion kann man mit Byteweisen auslesen leicht sehen, das die Daten hintereinander liegen.
Mit StructureUnion ist mir zwar vorher klar gewesen, das es ein anderes Ergebnis gibt, aber welches WUßte ich nicht. Nach dem Testen konnte ich mir die Ergebnisse aber einfach nicht sicher erklären.
Egal ob ich jetzt davon ausgehe, das es sich ab Adresse 4394694 (die Ergebnisse 13,3,4) um die von mir eingegebenen Werte handelt oder ob rein zufällig die selben Werte erscheinen, verstehe ich es nicht.
Falls die "13" nicht drinn wäre, hätte ich mir noch denken können, das einfach der "Nicht StructureUnion-Teil" hintereinander gespeichert wird und der andere Teil über einen Pointer der "wie und wo" auch immer außerhalt diesen Bereiches gespeichert wird.
Das Strukturesize nun 5 ergibt hätte ich gar nicht gedacht. 4 oder 7, das ja, aber so...
Da ich StructureUnion aber noch nie verwendet habe, ist mir auch klar, das ich vielleicht deren Funktion noch nicht richtig verstehe. Aber in der Hilfe steht ja auch quasi gar nichts dazu. Wer es nicht schon weiß, dem erschließt sich das nicht gleich. Denn mit einem einzigen Satz in der Hilfe ist einem nicht unbedingt weiter geholfen.
Vom Text her kann man da als Unwissender auch was ganz anderes rein interpretieren, als es wohl nach meinen Testversuchen ist.
"indem sie einige Felder innerhalb derselben Struktur teilen" und "Jedes Feld (Long, Float und Byte) befindet sich an der selben Adresse im Speicher" klang für mich selbst nach immer wieder lesen und auch jetzt wo ich was anderes denke eher danach, da egal welche "Variable" die "selbe Struktur" verwendet jeweils die "Felder aus der Union-Sektion" je Typ im selben Speicher stehen. Also global.
Aber nach dem testen sieht es halt so aus, also ob es eher so ist:
Innerhalb jeden eigenständigen strukturierten Speicherbereichs (wie z.B. einer strukturierten Variable) beginnen die Speicherbereiche aller Felder innerhalb der "StructureUnion" an der selben Speicheradresse. Dabei ist es unterheblich ob unterschiedliche Variablentypen genutzt werden. Sie alle werden an der selben Startadresse abgelegt. Diese Startadresse liegt innerhalb des strukturierten Speicherbereichs. Die Speichergrößte des StrutureUnions-Bereichs entspricht dem größten Feld innerhalb des Bereichs. StructureUnion bezieht sich jeweils nur auf den mit dieser Strukture allokierten Bereich. Unterschiedle Variablen oder Speicherbereiche mit selber Struktur nutzen nie den selben Speicherbereich.
Das ist jetzt wohl auch noch nicht perfekt ausgedrückt, liegt aus meiner Sicht dem was das Beispiel her gibt und ich ausgetest habe aber recht nahe. So scheint es aus meiner Sicht zu laufen,
steht nur leider so nicht in der Hilfe.
Wenn es so ist, dann ist das an sich eine ganz simple Sache, auch wenn ich sowas gerade nicht gesucht habe.
Ich bin also eher über den Hilfetext irritiert.
Grüßle und gute Nacht
Toshy
1. Win10
PB6.1