Gültigkeit von Zeigern überprüfen
Gültigkeit von Zeigern überprüfen
Hallo Leute,
habe schon wieder ein Anliegen...
Wie kann ich am besten überprüfen, ob ein Pointer gültig ist? Gibt es native Funktionen (sowas wie isPointer() oder isValid()...)?
In MSDN habe ich zumindest eine API gefunden (IsBadCodePtr_), allerdings gilt diese als veraltet.
viele Grüße,
SBond
habe schon wieder ein Anliegen...
Wie kann ich am besten überprüfen, ob ein Pointer gültig ist? Gibt es native Funktionen (sowas wie isPointer() oder isValid()...)?
In MSDN habe ich zumindest eine API gefunden (IsBadCodePtr_), allerdings gilt diese als veraltet.
viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e


Re: Gültigkeit von Zeigern überprüfen
Welche Gültigkeit willst du denn da überprüfen?
Beispiel: Nur weil der Speicher von einem Bild gültig ist, heißt es ja noch lange nicht, dass auch das Bild selbst noch gültig ist.
Viele Zeiger stammen ja garnicht von irgendwelchen Initialisierungen, sonden sind wirklich nur Zeiger zu Listen-Elementen, Array-Felder, String-Position, ...
Die Art des Ziels steht aber nicht im Zeiger drin, somit kann auch deren Gültigkeit (ist das Array noch groß genug, existiert das List-Element, ist der String noch da) nicht überprüft werden.
Für Speicher die mit AllocateMemory erstellt wurden, aknnst du vllt diese Funktion hier nutzen:
http://www.purebasic.fr/english/viewtop ... =3&t=60264
Beispiel: Nur weil der Speicher von einem Bild gültig ist, heißt es ja noch lange nicht, dass auch das Bild selbst noch gültig ist.
Viele Zeiger stammen ja garnicht von irgendwelchen Initialisierungen, sonden sind wirklich nur Zeiger zu Listen-Elementen, Array-Felder, String-Position, ...
Die Art des Ziels steht aber nicht im Zeiger drin, somit kann auch deren Gültigkeit (ist das Array noch groß genug, existiert das List-Element, ist der String noch da) nicht überprüft werden.
Für Speicher die mit AllocateMemory erstellt wurden, aknnst du vllt diese Funktion hier nutzen:
http://www.purebasic.fr/english/viewtop ... =3&t=60264
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Gültigkeit von Zeigern überprüfen
Das scheint für dich nützlich zu sein: http://www.purebasic.fr/german/viewtopic.php?p=247636
- 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: Gültigkeit von Zeigern überprüfen
Nein!
Die API ist unzuverlässig und es gibt keine Möglichkeit einen gültigen Pointer zu überprüfen.
Es liegt also an Dir, nur Pointer zu nutzen, wo Du sicher bist, das diese Existieren. Aber dies
stellt ja im normalfall kein Problem dar.
Gruß
Thomas
Die API ist unzuverlässig und es gibt keine Möglichkeit einen gültigen Pointer zu überprüfen.
Es liegt also an Dir, nur Pointer zu nutzen, wo Du sicher bist, das diese Existieren. Aber dies
stellt ja im normalfall kein Problem dar.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Gültigkeit von Zeigern überprüfen
ah.. ok danke
Nun ich bin gerade dabei meinen Quellcode robuster zu gestalten um eventuelle Abstürze vorzubeugen. Ich nutzte unter anderem Prototypes, also Funktionszeiger. Ich weiß nicht wie groß die Wahrscheinlichkeit ist, das so ein Zeiger ungültig wird. Bisher habe ich nur überprüft, ob ein Pointer ungleich Null ist.
Wahrscheinlich mach ich mich auch nur verrückt

Nun ich bin gerade dabei meinen Quellcode robuster zu gestalten um eventuelle Abstürze vorzubeugen. Ich nutzte unter anderem Prototypes, also Funktionszeiger. Ich weiß nicht wie groß die Wahrscheinlichkeit ist, das so ein Zeiger ungültig wird. Bisher habe ich nur überprüft, ob ein Pointer ungleich Null ist.
Wahrscheinlich mach ich mich auch nur verrückt

41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e


Re: Gültigkeit von Zeigern überprüfen
Aber wenn du weißt das ein Pointer zu einer Funktion ungültig geworden ist (wie auch immer), dann kannst du ja die Funktion eh nicht mehr aufrufen und damit musst du dein Programm eh abrupt beenden (= kontrollierter Absturz).
Was wichtig wäre, ist ein vernünftiges OnError-Management, damit du weiß warum das Programm abgestürtzt ist und nicht im dunklen stehst.
Was wichtig wäre, ist ein vernünftiges OnError-Management, damit du weiß warum das Programm abgestürtzt ist und nicht im dunklen stehst.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Gültigkeit von Zeigern überprüfen
öhhh...
in der Tat habe ich vor einigen Tagen das erste mal diese OnError-Funktion eingebunden. Sie ist wirklich hilfreich zumal immer wieder Fehler auftreten, die man beim Programmieren vergessen hat. Bei mir ist es oft die Division durch Null, die ich vergesse abzusichern. OnError ist da eine große Hilfe, den Fehler zu finden. Aber was genau meinst du mit "vernünftiges OnError-Management"? habe bis jetzt nur die Ausgabe der Datei und Zeilennummer. Mit den Assembler-Ausgaben kann ich gar nichts anfangen.
in der Tat habe ich vor einigen Tagen das erste mal diese OnError-Funktion eingebunden. Sie ist wirklich hilfreich zumal immer wieder Fehler auftreten, die man beim Programmieren vergessen hat. Bei mir ist es oft die Division durch Null, die ich vergesse abzusichern. OnError ist da eine große Hilfe, den Fehler zu finden. Aber was genau meinst du mit "vernünftiges OnError-Management"? habe bis jetzt nur die Ausgabe der Datei und Zeilennummer. Mit den Assembler-Ausgaben kann ich gar nichts anfangen.

41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e


Re: Gültigkeit von Zeigern überprüfen
In den pbosl gibt es noch eine Try&Catch Lib, funktioniert unter 32 bit sehr gut.
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Re: Gültigkeit von Zeigern überprüfen
nun es schon eine Möglichkeit, ist zwar nur eine Krücke, funktioniert aber recht gut
Gründe um so etwas zu nutzen gibt es viele
z.B. wenn man als Argument für eine Procedure, wahlweise eine Zahl oder einen String übergeben will und diese Daten aus einer externen Datei holen will.
Mit folgendem Macro läßt sich dies bewerkstelligen:
Code: Alles auswählen
If OpenWindow(0, 0, 0, 270, 160, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(0, 10, 10, 250, 20, "TextGadget Standard (Left)")
pointer = 1133
If SendMessage_(GadgetID(0), #WM_SETTEXT, 0, pointer) = 0
Debug "huh, bad pointer"
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
z.B. wenn man als Argument für eine Procedure, wahlweise eine Zahl oder einen String übergeben will und diese Daten aus einer externen Datei holen will.
Mit folgendem Macro läßt sich dies bewerkstelligen:
Code: Alles auswählen
Macro InputField_SetAttribut(pbnr, attribut, wert1, wert2 = 0)
CompilerSelect attribut
CompilerCase #InputField_Infotext
InputField_SetAttribute(pbnr, attribut, @wert1, wert2)
CompilerDefault
InputField_SetAttribute(pbnr, attribut, wert1, wert2)
CompilerEndSelect
EndMacro
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Re: Gültigkeit von Zeigern überprüfen
Unter 64 Bit nich? Schlecht!edel hat geschrieben:In den pbosl gibt es noch eine Try&Catch Lib, funktioniert unter 32 bit sehr gut.