Seite 1 von 1

[5.31 x86 Win] PeekS mit Längenangabe und Ascii Null-Term.

Verfasst: 07.08.2015 15:04
von PeDre
Ich habe möglicherweise einen Fehler bei der Verwendung von PeekS und ASCII-Zeichen gefunden.
Wenn man die Längenangabe bei PeekS verwendet, wird ein NULL-Terminierungszeichen mitzurückgegeben.
Bei dem Einbinden einer DLL ist mir das jetzt aufgefallen.
Hier ist ein konstruierter Beispielcode der den Fehler zeigt:

Code: Alles auswählen

EnableExplicit

Dim char.a(10)
Define text.s

char(0) = 65
char(1) = 66
char(2) = 67
char(3) = 68

Debug PeekS(@char(0), 20, #PB_Ascii) + "E" ; ERROR: Unicode executable "ABCD" -  Ascii executable "ABCDE"
Debug PeekS(@char(0), 8, #PB_Ascii) + "E" ; ERROR: Unicode executable "ABCD" -  Ascii executable "ABCDE"
Debug PeekS(@char(0), -1, #PB_Ascii) + "E" ; OK: Unicode executable "ABCDE" -  Ascii executable "ABCDE"

text = PeekS(@char(0), 20, #PB_Ascii)
text + "E"
Debug text ; OK: Unicode executable "ABCDE" -  Ascii executable "ABCDE"
PureBasic 5.31 (x86) und Windows XP SP3 32-Bit

Da ich mich mit PureBasic noch nicht gut auskenne, kann das auch eine Eigenheit von PureBasic sein, aber mir kommt es falsch vor.

Peter

Re: [5.31 x86 Win] PeekS mit Längenangabe und Ascii Null-Ter

Verfasst: 07.08.2015 15:39
von mhs
Das scheint tatsächlich ein Fehler zu sein. Auch wenn man mit PokeS in einen Speicherbereich schreibt passier das gleiche.

Code: Alles auswählen

EnableExplicit

Define *Char
Define text.s

*Char = AllocateMemory(10)
PokeS(*Char, "ABCD", -1, #PB_Ascii)

Debug PeekS(*Char, 20, #PB_Ascii) + "E" ; ERROR: Unicode executable "ABCD" -  Ascii executable "ABCDE"
Debug PeekS(*Char, 8, #PB_Ascii) + "E" ; ERROR: Unicode executable "ABCD" -  Ascii executable "ABCDE"
Debug PeekS(*Char, -1, #PB_Ascii) + "E" ; OK: Unicode executable "ABCDE" -  Ascii executable "ABCDE"

text = PeekS(*Char, 20, #PB_Ascii)
text + "E"
Debug text ; OK: Unicode executable "ABCDE" -  Ascii executable "ABCDE"

Re: [5.31 x86 Win] PeekS mit Längenangabe und Ascii Null-Ter

Verfasst: 07.08.2015 20:52
von PeDre
Ich habe das Beispiel etwas erweitert. Der Fehler tritt nur auf, wenn die Längenangabe größer als der Text ist, der ausgelesen wird.

Code: Alles auswählen

EnableExplicit

Dim char.a(10)
Define text.s

Debug "Ascii"

char(0) = 65
char(1) = 66
char(2) = 67
char(3) = 68

Debug PeekS(@char(0), 20, #PB_Ascii) + "E" ; ERROR: Unicode exe "ABCD" -  OK: Ascii exe "ABCDE"
Debug PeekS(@char(0), 8, #PB_Ascii) + "E" ; ERROR: Unicode exe "ABCD" -  OK: Ascii exe "ABCDE"
Debug PeekS(@char(0), 3, #PB_Ascii) + "E" ; OK: Unicode exe "ABCE" -  OK: Ascii exec "ABCE"
Debug PeekS(@char(0), -1, #PB_Ascii) + "E" ; OK: Unicode exe "ABCDE" -  OK: Ascii exe "ABCDE"

text = PeekS(@char(0), 20, #PB_Ascii)
text + "E"
Debug text ; OK: Unicode exe "ABCDE" -  OK: Ascii exe "ABCDE"

Debug ""
Debug "Unicode"

char(0) = 65 : char(1) = 0
char(2) = 66 : char(3) = 0
char(4) = 67 : char(5) = 0
char(6) = 68 : char(7) = 0

Debug PeekS(@char(0), 20, #PB_Unicode) + "E" ; OK: Unicode exe "ABCDE" -  ERROR: Ascii exe "ABCD"
Debug PeekS(@char(0), 8, #PB_Unicode) + "E" ; OK: Unicode exe "ABCDE" -  ERROR: Ascii exe "ABCD"
Debug PeekS(@char(0), 3, #PB_Unicode) + "E" ; OK: Unicode exe "ABCE" -  OK: Ascii exe "ABCE"
Debug PeekS(@char(0), -1, #PB_Unicode) + "E" ; OK: Unicode exe "ABCDE" -  OK: Ascii exe "ABCDE"

text = PeekS(@char(0), 20, #PB_Unicode)
text + "E"
Debug text ; OK: Unicode exe "ABCDE" -  OK: Ascii exe "ABCDE"
Peter