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 :mrgreen:
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. :bounce:

Bin aber ohnehin dabei, deine Version mit "AllocateMemory" einzubauen. :allright:

Purifier bleibt ab jetzt mein ständiger Freund :mrgreen:

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 :mrgreen:
Nur bei Bedarf einschalten, ansonsten verlangsamt der Purifier die Programmausführung
erheblich, das macht dann auch keinen Spass mehr :mrgreen:

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

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. :allright:
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. :allright:

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