Gültigkeit von Zeigern überprüfen

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Gültigkeit von Zeigern überprüfen

Beitrag von SBond »

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

:D
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Gültigkeit von Zeigern überprüfen

Beitrag von STARGÅTE »

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
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
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Gültigkeit von Zeigern überprüfen

Beitrag von GronkhLP »

Das scheint für dich nützlich zu sein: http://www.purebasic.fr/german/viewtopic.php?p=247636
Bild
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: Gültigkeit von Zeigern überprüfen

Beitrag von ts-soft »

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
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
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Gültigkeit von Zeigern überprüfen

Beitrag von SBond »

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

:D
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Gültigkeit von Zeigern überprüfen

Beitrag von STARGÅTE »

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.
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
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Gültigkeit von Zeigern überprüfen

Beitrag von SBond »

ö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. :roll:
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

:D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Gültigkeit von Zeigern überprüfen

Beitrag von edel »

In den pbosl gibt es noch eine Try&Catch Lib, funktioniert unter 32 bit sehr gut.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Gültigkeit von Zeigern überprüfen

Beitrag von hjbremer »

nun es schon eine Möglichkeit, ist zwar nur eine Krücke, funktioniert aber recht gut

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

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
funker
Beiträge: 33
Registriert: 02.06.2014 12:32

Re: Gültigkeit von Zeigern überprüfen

Beitrag von funker »

edel hat geschrieben:In den pbosl gibt es noch eine Try&Catch Lib, funktioniert unter 32 bit sehr gut.
Unter 64 Bit nich? Schlecht!
Antworten