Seite 2 von 3
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 17:55
von ts-soft
Micha122 hat geschrieben:Ich habs auf die schnelle einfach mal so gemacht:
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
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 18:15
von Micha122
Ups, ein klarer Absturzkandidat.
Bin aber ohnehin dabei, deine Version mit "AllocateMemory" einzubauen.
Purifier bleibt ab jetzt mein ständiger Freund
Gruß und danke!
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 18:25
von ts-soft
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

Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 20:26
von NicTheQuick
ts-soft hat geschrieben:Oder man verwendet allokierten Speicher, der bleibt bis zum freigeben gültig:
Code: Alles auswählen
EnableExplicit
Procedure test()
Protected teststring.s = "C:\Users\Micha\Dropbox"
Protected *zeiger = AllocateMemory(Len(teststring) + SizeOf(Character)) ; für nullbyte
If *zeiger
PokeS(*zeiger, teststring)
ProcedureReturn *zeiger
EndIf
EndProcedure
Define *string = test()
Debug ""
Debug "Main"
Debug *string
Debug PeekS(*string)
FreeMemory(*string)
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).
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 20:35
von ts-soft
Shit, sowas kann passieren, wenn man hier auf die schnelle mal ein Beispiel reinpoked

Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 20:58
von Micha122
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.
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 21:10
von Micha122
@NicTheQuick :
AllocateMemory((Len(teststring) + 1) * SizeOf(Character))
Warum das "+1"?
Ohne "+1" wird bei mir kein Fehler mehr angezeigt.
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 21:30
von HeX0R
Micha122 hat geschrieben:@NicTheQuick :
AllocateMemory((Len(teststring) + 1) * SizeOf(Character))
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
Code: Alles auswählen
Protected *zeiger = AllocateMemory(StringByteLengh(teststring) + SizeOf(Character)) ; für nullbyte
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 23:20
von Micha122
Hallo HeX0R,
das mit der Nullbyte Ende- Markierung habe ich verstanden.
StringByteLengh + SizeOf(Character) = Anzahl Bytes + Nullbyte (Unicode 2 Byte) auch verstanden.
Danke!
Re: Frage zum Befehl Debug
Verfasst: 12.01.2014 10:23
von ts-soft
Hier noch eine andere Möglichkeit, ist aber nicht DLL-geeignet!
Statt zu poken nutzen wir eine strukture und überlassen die
Stringverwaltung dem Stringmanager:
Code: Alles auswählen
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
