Ich habe auch noch ein "nicht offiziell" veröffendliches Include:
Structure.pbi
(Link aktuallisiert 9.7.2010)
Dort gibt es für Memory : PokeT() und PeekT()
und für Files: WriteStructure() und ReadStructure()
Außerdem noch ein WriteArray() und ReadArray() welche aber nicht ganz fertig sind!
Die Funktionen geben dabei alle genau zurück wie viele Bytes tatsächlich geschrieben/gelesen werden
Das ganze läuft in der "Benutzung" dann so:
Wenn du eine Struktur hast, welche du in den obene genannten Funktionen benutzen willst, musst du diese Struktur erst "vorbereiten": mit AddStructureData(StructureName, Flag) (StructureName komplett klein schreiben!) (Flag gibt an ob String enthalten sind oder nicht)
Danach kannst du die Funktionen benutzen, hier ein Beispiel:
Code: Alles auswählen
Structure SubComplex
Byte.b
String.s
Long.l
EndStructure
Structure Complex
Long.l
StaticString.s{3}
Double.d
StringArray.SubComplex[4]
Word.w
EndStructure
AddStructureData(complex)
AddStructureData(subcomplex)
; StrukturAufbau auslesen, ist aber nicht notwendig:
Output$ = GetStructureData(Complex)
Debug "StrukturAufbau (komplex) : "+Output$
Output$ = GetStructureData(SubComplex)
Debug "StrukturAufbau (subkomplex) : "+Output$
Debug "----------------"
; StrukturGröße auslesen, wie sie im Speicher ist (String hat also Pointer-Länge):
Debug "StrukturSize (komplex) : "+Str(SizeOf(Complex))
Debug "StrukturSize (subkomplex) : "+Str(SizeOf(SubComplex))
Debug "----------------"
Source.Complex
Destination.Complex
Source\StaticString = "ABC"
Source\Double = #PI
Source\StringArray[2]\Long = 255
Source\StringArray[1]\String = "Dies ist ein Test"
Debug "----------------"
Debug "WriteStructure und ReadStructure"
Debug "----------------"
CreateFile(0, "Test.txt")
Length = WriteStructure(0, Source, Complex)
CloseFile(0)
Debug "Write_BufferLänge: "+Str(Length)
ReadFile(0, "Test.txt")
Length = ReadStructure(0, Destination, Complex)
CloseFile(0)
Debug "Read_BufferLänge: "+Str(Length)
Debug "Inhalt:"
Debug Destination\StaticString
Debug Destination\Double
Debug Destination\StringArray[2]\Long
Debug Destination\StringArray[1]\String
Dim SourceArray.SubComplex(1,4,9)
Dim DestinationArray.SubComplex(1,4,9)
SourceArray(0,0,0)\String = "0,0,0"
SourceArray(1,4,9)\String = "1,4,9"
Debug "----------------"
Debug "WriteArray und ReadArray"
Debug "----------------"
CreateFile(0, "Test.txt")
Length = WriteArray(0, SourceArray(), SubComplex)
CloseFile(0)
Debug "Write_BufferLänge: "+Str(Length)
ReadFile(0, "Test.txt")
Length = ReadArray(0, DestinationArray(), SubComplex)
CloseFile(0)
Debug "Read_BufferLänge: "+Str(Length)
Debug "Inhalt:"
Debug DestinationArray(0,0,0)\String
Debug DestinationArray(1,4,9)\String
Aber wie gesagt, benutzung auf eigene Gefahr, sie ist zwar auch bei mir in Benutzung, und auch schnell, da mehrere Long oder andere Daten erst geschrieben/gelesen werden wenn ein String kommt, der "anders" behandelt werden muss,
aber vllt gibts Bugs in zusammenhang mit 64Bit oder UNICode ...
wenn ja bitte melden!