Umwandlungsproblem Text -->Memory-->Text

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Umwandlungsproblem Text -->Memory-->Text

Beitrag 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㨩㜳�
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag 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 :

Code: Alles auswählen

Length = StringByteLength(StrVar, #PB_Unicode)
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)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag von ProgOldie »

Mann, bist du schnell!
Aber genau das war's. Danke!
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag 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. :mrgreen:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag 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 ? :mrgreen:

Wobei ich noch nicht verstehe, warum Du nicht PokeS sondern MoveMemory benutzt....
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag 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)
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag 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)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag von NicTheQuick »

Warum so kompliziert?

Code: Alles auswählen

StringByteLength(Chr(32), Format)
Das hier tut's auch und sieht nicht so verwirrend aus.

Code: Alles auswählen

SizeOf(Character)
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag von Josh »

NicTheQuick hat geschrieben:Das hier tut's auch und sieht nicht so verwirrend aus.

Code: Alles auswählen

SizeOf(Character)
Und hat den Vorteil, dass es bereits vom Compiler aufgelöst wird.
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Umwandlungsproblem Text -->Memory-->Text

Beitrag von Bisonte »

NicTheQuick hat geschrieben:Warum so kompliziert?

Code: Alles auswählen

SizeOf(Character)
Genau DAS war mir so auf die schnelle nicht eingefallen ;)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten