Frage zum Befehl Debug

Anfängerfragen zum Programmieren mit PureBasic.
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: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
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 »

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!
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: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:
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
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Frage zum Befehl Debug

Beitrag 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).
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 »

Shit, sowas kann passieren, wenn man hier auf die schnelle mal ein Beispiel reinpoked :o
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 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.
Barcodes for PureBasic - http://micha122.bplaced.net/
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Frage zum Befehl Debug

Beitrag von Micha122 »

@NicTheQuick :
AllocateMemory((Len(teststring) + 1) * SizeOf(Character))
Warum das "+1"?
Ohne "+1" wird bei mir kein Fehler mehr angezeigt.
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Frage zum Befehl Debug

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

Re: Frage zum Befehl Debug

Beitrag 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!
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 »

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