Seite 1 von 3
Frage zum Befehl Debug
Verfasst: 11.01.2014 15:37
von Micha122
Mir ist da ein etwas merkwürdiges Verhalten des Debug- Befehl aufgefallen.
Dieser Code funktioniert.
Code: Alles auswählen
Procedure test()
teststring.s = "C:\Users\Micha\Dropbox"
*zeiger = @teststring
;Debug"Procedure"
;Debug "Adresse: " + *zeiger
Debug "Inhalt: " + PeekS(*zeiger)
ProcedureReturn *zeiger
EndProcedure
*string = test()
Debug""
Debug"Main"
Debug *string
Debug PeekS(*string)
Ausgabe:
Inhalt: C:\Users\Micha\Dropbox
Main
2033664
C:\Users\Micha\Dropbox
Dieser Code funktioniert nicht. Der einzige Unterschied ist das Semikolon in Zeile 6.
Code: Alles auswählen
Procedure test()
teststring.s = "C:\Users\Micha\Dropbox"
*zeiger = @teststring
;Debug"Procedure"
;Debug "Adresse: " + *zeiger
;Debug "Inhalt: " + PeekS(*zeiger)
ProcedureReturn *zeiger
EndProcedure
*string = test()
Debug""
Debug"Main"
Debug *string
Debug PeekS(*string)
Ausgabe:
Main
21563392
Ä?Ä?
Wie zu sehen, stimmt die String- Ausgabe nicht.
Gruß, Micha122
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:02
von Danilo
teststring.s ist ein lokaler String in der Prozedur test(). Beim verlassen der Prozedur wird dieser
lokale String freigegeben, und somit sind auch Pointer auf diesen String ungültig.
Das es beim ersten Beispiel funktioniert ist Zufall, aber trotzdem falsch.
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:11
von ts-soft
Wenn Du teststring Static machst, funktioniert das ganze (aber nicht in DLL-Prozeduren!)
Code: Alles auswählen
Procedure test()
Static teststring.s = "C:\Users\Micha\Dropbox"
*zeiger = @teststring
;Debug"Procedure"
;Debug "Adresse: " + *zeiger
;Debug "Inhalt: " + PeekS(*zeiger)
ProcedureReturn *zeiger
EndProcedure
*string = test()
Debug""
Debug"Main"
Debug *string
Debug PeekS(*string)
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:21
von Micha122
Habe "Shared" vergessen!

Trotzdem ist das Verhalten aber merkwürdig, mit dem eingeschalteten Debug- Befehl klappt der Code ohne Shared und Static.
Und erst ohne den Debug- Befehl verhält sich der Code richtig und zeigt natürlich eine falsche String- Ausgabe an.
Scheint wohl ein kleiner Bug zu sein?
Gruß, Micha122
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:26
von ts-soft
Ist kein Bug, ist nur ein zufällig noch vorhandener String in freigegebenen Speicher.
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:38
von Micha122
@ts-soft:
Ist ja krass, hätte nicht gedacht das es beim Programmieren auch Zufälle gibt.
Mein Programmierfehler brachte mich gestern fast um den Verstand. Bedingt durch diesen "Zufall" der meinen Code dann manchmal hat funktioniern lassen, war ich kurz davor
Noch ein Nachtrag zu meinem letzten Beitrag:
Shared ist natürlich blödsinn, dann könnte ich mir ja den Zeiger ersparen.
Dein Beispiel mit Static ist da schon besser.
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:43
von ts-soft
Micha122 hat geschrieben:@ts-soft:
Ist ja krass, hätte nicht gedacht das es beim Programmieren auch Zufälle gibt.
Wenn Du einen ungültigen Speicher ausliest, stehen dort auch zufällige Werte drin. Nach
Verlassen der Procedure ist dieser Pointer ungültig, da kann sonstwas drin stehen, evtl.
ist sogar noch der String vorhanden, der mal dort drinnen stand
Wenn Du das nicht verstehst, solltest Du die Sache mit den Pointern vielleicht erstmal lassen oder
passende Infos dazu suchen

Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 16:51
von Danilo
Micha122 hat geschrieben:Shared ist natürlich blödsinn, dann könnte ich mir ja den Zeiger ersparen.
Dein Beispiel mit Static ist da schon besser.
Der statische String is aber genauso fest wie ein Shared oder Global String, d.h. es gibt nur
eine Instanz davon. Wird bei einem zweiten Aufruf der String verändert, ändert sich auch
der String am Pointer vom ersten Aufruf.
Code: Alles auswählen
Procedure x(i)
Static string.s
string = "String "+Str(i)
ProcedureReturn @string
EndProcedure
p1 = x(1)
Debug PeekS(p1)
p2 = x(2)
Debug PeekS(p2)
Debug "-----------"
; und noch einmal...
Debug PeekS(p1)
Debug PeekS(p2)
Bei einem unveränderlichem String kannst Du also gleich schreiben:
um den Pointer zu bekommen.
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 17:10
von ts-soft
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)
Re: Frage zum Befehl Debug
Verfasst: 11.01.2014 17:29
von Micha122
Ich habs auf die schnelle einfach mal so gemacht:
Code: Alles auswählen
DeclareModule test
Declare test(*string)
EndDeclareModule
Module test
Procedure test(*string)
PokeS(*string, "C:\Users\Micha\Dropbox")
ProcedureReturn
EndProcedure
EndModule
UseModule test
string.s = ""
test(@string)
Debug string
@ts-soft:
Die Version mit dem allokierten Speicher gefällt mir am besten. Sollte dann eigentlich keine Rolle mehr spielen, ob die Procedure in einer DLL oder in einem Modul ist.