Seite 1 von 1
Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:01
von ProgOldie
Code: Alles auswählen
EnableExplicit
;getestet unter PB 5.62 Windows 10
Define *Mem
Structure PersDat
Name.s
Alter.i
*Beschreibung
EndStructure
Define Person.PersDat, TestText.s
Procedure STRINGtoMEM(StrVar.s)
;Speichert den String im Memory im Format Unicode
Protected *mem
If StrVar >""
*mem= AllocateMemory(StringByteLength(StrVar,#PB_Unicode))
MoveMemory(@StrVar, *mem,StringByteLength(StrVar,#PB_Unicode))
EndIf
Debug "STRINGtoMEM ergibt Size="+Str(StringByteLength(StrVar,#PB_Unicode))
ProcedureReturn *mem
EndProcedure
Procedure.s MEMtoSTRING(*mem)
Protected StrVar.s
If *mem
StrVar=PeekS(*mem,MemorySize(*mem),#PB_Unicode)
Else
StrVar=""
EndIf
Debug "MEMtoStr ergibt "+StrVar
ProcedureReturn StrVar
EndProcedure
TestText="mittlere Größe, blondes Haar"
;Variante 1
; *Mem=STRINGtoMEM(TestText)
; Debug MEMtoSTRING(*Mem)
;Variante 2
Person\Beschreibung=STRINGtoMEM(TestText)
Debug MEMtoSTRING(Person\Beschreibung)
Warum tauchen sowohl in Variante 1 als auch in Variante 2 zusätzliche Sonderzeichen auf ? Bei Variante 2 könnte ich mir Probleme eher vorstellen, weil in der Struktur 'PersDat' ein Pointer gespeichert wird.
STRINGtoMEM ergibt Size=56
MEMtoStr ergibt mittlere Größe, blondes Haar㨩㜳�
mittlere Größe, blondes Haar㨩㜳�
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:06
von Bisonte
Du hast vergessen, dass die Länge des Strings nicht nur die Zeichen sind, sondern auch noch das abschliessende 0-Byte
Also nicht nur :
sondern
Code: Alles auswählen
Length = StringByteLength(StrVar, #PB_Unicode) + StringByteLength(Chr(13), #PB_Unicode)
damit klappts auch mit der Debug Ausgabe :
Code: Alles auswählen
EnableExplicit
;getestet unter PB 5.62 Windows 10
Define *Mem
Structure PersDat
Name.s
Alter.i
*Beschreibung
EndStructure
Define Person.PersDat, TestText.s
Procedure STRINGtoMEM(StrVar.s)
;Speichert den String im Memory im Format Unicode
Protected *mem
If StrVar >""
*mem= AllocateMemory(StringByteLength(StrVar,#PB_Unicode)+StringByteLength(Chr(13),#PB_Unicode))
MoveMemory(@StrVar, *mem,StringByteLength(StrVar,#PB_Unicode))
EndIf
Debug "STRINGtoMEM ergibt Size="+Str(StringByteLength(StrVar,#PB_Unicode)+StringByteLength(Chr(13),#PB_Unicode))
ProcedureReturn *mem
EndProcedure
Procedure.s MEMtoSTRING(*mem)
Protected StrVar.s
If *mem
StrVar=PeekS(*mem,MemorySize(*mem),#PB_Unicode)
Else
StrVar=""
EndIf
Debug "MEMtoStr ergibt "+StrVar
ProcedureReturn StrVar
EndProcedure
TestText="mittlere Größe, blondes Haar"
;Variante 1
; *Mem=STRINGtoMEM(TestText)
; Debug MEMtoSTRING(*Mem)
;Variante 2
Person\Beschreibung=STRINGtoMEM(TestText)
Debug MEMtoSTRING(Person\Beschreibung)
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:10
von ProgOldie
Mann, bist du schnell!
Aber genau das war's. Danke!
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:13
von RSBasic
ProgOldie hat geschrieben:Mann, bist du schnell!
+1, ich wollte vorhin auch posten, aber dann musste ich meine Lösung verwerfen, weil Bisonte einfach schneller war.

Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:20
von Bisonte
ProgOldie hat geschrieben:Mann, bist du schnell!
Es gibt so Dinge, an denen hat man sich selbst mal die Zähne ausgebissen
Da erinnert man sich schnell dran.
Wohin, meinst Du wohl, habe ich in deinem Code zuerst hingesehen ?
Wobei ich noch nicht verstehe, warum Du nicht PokeS sondern MoveMemory benutzt....
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:32
von ProgOldie
Wobei ich noch nicht verstehe, warum Du nicht PokeS sondern MoveMemory benutzt
Weil ich immer dachte, das das gefährlich ist.
also folgende Änderung:
Code: Alles auswählen
;Statt
;MoveMemory(@StrVar, *mem,StringByteLength(StrVar,#PB_Unicode))
;Neu
PokeS(*mem,StrVar,#PB_Unicode)
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 13:38
von Bisonte
Arg, da hast du die Länge vergessen.
Zwischen dem String und dem Format kommt bei PokeS IMMER die Länge...
Kleine Helfer in 2 Prozeduren :
Code: Alles auswählen
Procedure.i SetMemString(String.s, Format = #PB_UTF8)
Protected *Mem = #Null, Size = StringByteLength(String, Format) + StringByteLength(Chr(32), Format)
If Size > 1
*Mem = AllocateMemory(Size)
If *Mem
PokeS(*Mem, String, Size, Format)
EndIf
EndIf
ProcedureReturn *Mem
EndProcedure
Procedure.s GetMemString(*Mem, Format = #PB_UTF8)
Protected Result.s = ""
If *Mem
Result = PeekS(*Mem, -1, Format)
EndIf
ProcedureReturn Result
EndProcedure
a = SetMemString("blondes Haar", #PB_Unicode)
Debug GetMemString(a, #PB_Unicode)
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 14:46
von NicTheQuick
Warum so kompliziert?
Das hier tut's auch und sieht nicht so verwirrend aus.
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 15:12
von Josh
NicTheQuick hat geschrieben:Das hier tut's auch und sieht nicht so verwirrend aus.
Und hat den Vorteil, dass es bereits vom Compiler aufgelöst wird.
Re: Umwandlungsproblem Text -->Memory-->Text
Verfasst: 02.03.2018 19:38
von Bisonte
NicTheQuick hat geschrieben:Warum so kompliziert?
Genau DAS war mir so auf die schnelle nicht eingefallen
