Re: SizeOf( structure ) / ASCII-Größe unter Unicode ermittel
Verfasst: 24.01.2018 11:44
Hast du meinen letzten Beitrag bis zum Ende gelesen? Dann hast du deine 48 Byte.
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
Structure strBHC_Header
sMagicWord.a[4]
wDatabaseType.w
sUserdefinedDatabaseTypecode.a[8]
lVersion.l
sDescription.a[30]
EndStructure
Debug SizeOf(strBHC_Header)
; ergibt 90 statt 48 wie im ASCII mode
Define bhc.strBHC_Header
; Schreiben
PokeS(@bhc\sDescription, "Hallo", 30, #PB_Ascii)
; Lesen
Debug PeekS(@bhc\sDescription, 30, #PB_Ascii)Code: Alles auswählen
WriteData(File, @Header, SizeOf(strBHC_Header))
ReadData(File, @Header, SizeOf(strBHC_Header))Code: Alles auswählen
Structure strBHC_Header
sMagicWord.a[4]
wDatabaseType.w
sUserdefinedDatabaseTypecode.a[8]
lVersion.l
sDescription.a[30]
EndStructure
Debug SizeOf(strBHC_Header)
; ergibt 90 statt 48 wie im ASCII mode
Global bhc.strBHC_Header
Global bhc2.strBHC_Header
Macro SetA(Destination, Text)
PokeS(@Destination, Text, SizeOf(Destination), #PB_Ascii)
EndMacro
Macro GetA(Source)
PeekS(@Source, SizeOf(Source), #PB_Ascii)
EndMacro
Debug SizeOf(bhc\sMagicWord)
; Schreiben
SetA(bhc\sMagicWord, "12345678")
SetA(bhc\sDescription, "Hallo")
If CreateFile(0, GetHomeDirectory() + "TestData.bin")
Debug "Save datablock"
WriteData(0, bhc, SizeOf(strBHC_Header))
CloseFile(0)
EndIf
; Lesen
If ReadFile(0, GetHomeDirectory() + "TestData.bin")
Debug "Read datablock"
ReadData(0, bhc2, SizeOf(strBHC_Header))
CloseFile(0)
EndIf
Debug GetA(bhc2\sMagicWord)
Debug GetA(bhc2\sDescription)
CallDebugger
Code: Alles auswählen
Structure Struct
sText.s{6 / SizeOf(Character)}
EndStructure
Global Test.Struct
; Version mit Poke...
PokeS(@Test\sText, "Hallo!", 6, #PB_Ascii)
ShowMemoryViewer(@Test\sText, 100)
CallDebugger
; Version mit Ascii()...
*mem = Ascii("012345")
CopyMemory(*mem, @Test\sText, 6)
FreeMemory(*mem)
ShowMemoryViewer(@Test\sText, 100)
CallDebuggerDanke für Deine Mühe. Das funktioniert aber offenbar nicht mehr, wenn man als Strukturvariable eine Pointervariable nutzt. Ich nutze ja Deine OOP-BaseClass für dieses Projekt und die Referenzierung der Strukturen beginnt damit immer mit "*this\..."mk-soft hat geschrieben:Habe mal zwei Macros geschrieben um vereinfacht ASCII Arrays zu lesen und zu schreiben,
und die Sache mit WriteData und ReadData...
Code: Alles auswählen
Structure strBHC_Header
sMagicWord.a[4]
wDatabaseType.w
sUserdefinedDatabaseTypecode.a[8]
lVersion.l
sDescription.a[30]
EndStructure
Debug SizeOf(strBHC_Header)
; ergibt 90 statt 48 wie im ASCII mode
Global bhc.strBHC_Header
Global *bhc2.strBHC_Header
Macro SetA(Destination, Text)
PokeS(@Destination, Text, SizeOf(Destination), #PB_Ascii)
EndMacro
Macro GetA(Source)
PeekS(@Source, SizeOf(Source), #PB_Ascii)
EndMacro
Debug SizeOf(bhc\sMagicWord)
; Schreiben
SetA(bhc\sMagicWord, "1234")
SetA(bhc\sDescription, "Hallo")
If CreateFile(0, "D:\TestData.bin")
Debug "Save datablock"
WriteData(0, bhc, SizeOf(strBHC_Header))
CloseFile(0)
EndIf
; Lesen
If ReadFile(0, "D:\TestData.bin")
Debug "Read datablock"
ReadData(0, *bhc2, SizeOf(strBHC_Header))
CloseFile(0)
EndIf
Debug GetA(*bhc2\sMagicWord)
Debug GetA(*bhc2\sDescription)
CallDebuggerCode: Alles auswählen
Procedure.i Ascii2(String$)
Protected NeededMemorySize, *Memory
NeededMemorySize = StringByteLength(String$, #PB_Ascii)
NeededMemorySize + 1 ; For the null-character on the end of the string (ascii/utf8: 1 byte, unicode: 2 bytes)
*Memory = AllocateMemory(NeededMemorySize)
If *Memory
PokeS(*Memory, String$, -1, #PB_Ascii)
EndIf
ProcedureReturn *Memory
EndProcedureCode: Alles auswählen
; Schreiben
PokeS(@Header\sMagicWord[0], "ABCD", -1, #PB_Ascii)Code: Alles auswählen
; Schreiben
PokeS(@Header\sMagicWord[0], "ABCD", -1, #PB_Ascii | #PB_String_NoZero)*bhc2 ist ja nur ein Pointer auf eine Speichergebiet. Wenn Du keinen Speicher anforderst geht das natürlich nichtKurzer hat geschrieben: Damit klappt das nicht mehr. Das kannst Du prüfen indem Du in Deinem Code aus der Strukturvariable "bhc2" ein "*bhc2" machst.
Code: Alles auswählen
*bhc2 = AllocateStructure(strBHC_Header)
; Lesen
If ReadFile(0, "D:\TestData.bin")
Debug "Read datablock"
ReadData(0, *bhc2, SizeOf(strBHC_Header))
CloseFile(0)
EndIf