Frage zum Befehl Debug

Anfängerfragen zum Programmieren mit PureBasic.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Frage zum Befehl Debug

Beitrag 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
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Frage zum Befehl Debug

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage zum Befehl Debug

Beitrag 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) 
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.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Frage zum Befehl Debug

Beitrag von Micha122 »

Habe "Shared" vergessen! :oops:
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
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage zum Befehl Debug

Beitrag von ts-soft »

Ist kein Bug, ist nur ein zufällig noch vorhandener String in freigegebenen Speicher.
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.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Frage zum Befehl Debug

Beitrag von Micha122 »

@ts-soft:
Ist ja krass, hätte nicht gedacht das es beim Programmieren auch Zufälle gibt. :o
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 :bluescreen: >_<

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.
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage zum Befehl Debug

Beitrag von ts-soft »

Micha122 hat geschrieben:@ts-soft:
Ist ja krass, hätte nicht gedacht das es beim Programmieren auch Zufälle gibt. :o
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 :mrgreen:

Wenn Du das nicht verstehst, solltest Du die Sache mit den Pointern vielleicht erstmal lassen oder
passende Infos dazu suchen :wink:
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.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Frage zum Befehl Debug

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

Code: Alles auswählen

p1 = @"C:\Users\Micha\Dropbox"
um den Pointer zu bekommen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Frage zum Befehl Debug

Beitrag 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)
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.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Frage zum Befehl Debug

Beitrag 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.
Barcodes for PureBasic - http://micha122.bplaced.net/
Antworten