Das ist gar nicht gut, Du pokst in einen Speicher von 1 oder 2 Byte länge
Schalte mal im den Compiler-Optionen den Purifier ein, dann entdeckst Du solche
Fehler oftmals selber.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Micha122 hat geschrieben:Purifier bleibt ab jetzt mein ständiger Freund
Nur bei Bedarf einschalten, ansonsten verlangsamt der Purifier die Programmausführung
erheblich, das macht dann auch keinen Spass mehr
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Diese Version ist aber auch nur sicher im Ascii-Modus. Korrekterweise müsste da stehen: AllocateMemory((Len(teststring) + 1) * SizeOf(Character))
Oder man nutzt zumindest PokeS korrekt mit PokeS(*zeiger, teststring, -1, #PB_Ascii).
Shit, sowas kann passieren, wenn man hier auf die schnelle mal ein Beispiel reinpoked
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Habe auch gemerkt, das im Unicode Modus der Doppelte Speicher benötigt wird.
Mit Purifier wurde Overflow direkt angezeigt.
Hab den Code dann abgeändert, aber mich dann doch nicht so ganz getraut das zu posten.
Warum das "+1"?
Ohne "+1" wird bei mir kein Fehler mehr angezeigt.
Ein String in PB hat immer noch ein Null-Byte am Ende (bzw. zwei in Unicode), um das Ende zu markieren.
Beim Poken wird das/die Nullbyte mitgeschrieben.
Also MUSS man das tatsächlich so machen, sonst schreibst Du über den bereitgestellten Speicherbereich.
Man kann übrigens auch StringByteLength() anstatt Len() benutzen.
Also
Hier noch eine andere Möglichkeit, ist aber nicht DLL-geeignet!
Statt zu poken nutzen wir eine strukture und überlassen die
Stringverwaltung dem Stringmanager:
DeclareModule test
Declare test(*string.String)
EndDeclareModule
Module test
EnableExplicit
Procedure test(*string.String)
*string\s = "C:\Users\Micha\Dropbox"
EndProcedure
EndModule
EnableExplicit
UseModule test
Define string.String\s = ""
test(@string)
Debug string\s
Einfacher Code, aber schwer zu verstehen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.