Ich habe mich beim Lesen im Internet über die Verwendung von Pointern selber durcheinandergebracht.
Daher noch mal zur Sicherheit meine Frage: Wie lange bleiben Zeiger bestehen/gültig?
Ich dachte bisher, sie bleiben so lange gültig, wie das Element besteht, auf das sie verweisen, d.h. solange ich eine Variable, eine Struktur oder ein Listenelement nicht ändere, sollte der Zeiger darauf gültig bleiben. Oder kann es sein, dass intern irgendwelche Verschiebungen im Speicher passieren, die dafür sorgen können, dass ein Zeiger nicht mehr richtig funktioniert?
Wie lange bleiben Zeiger bestehen?
Re: Wie lange bleiben Zeiger bestehen?
Hängt ein bisschen davon ab "woher" dieser Zeiger kommt.
Wenn du mit Element ein Element in einer LinkedList meinst, dann ja, dieser Pointer ist so lange valide bis das Element gelöscht wird.
Pointer zu Memory-Buffern oder Strings bleiben auch solange valide bis sie wieder freigeben werden oder du mit ReAllocateMemory oder durch ändern des Strings die Größe änderst.
Bei Pointer die von DrawingBuffer() u.ä. zurückgegeben werden, sind Zeitlich begrenzt, in dem Fall z.B. bis StopDrawing() aufgerufen wird.
Bei externen Pointer müsstest du in deren Dokumentationen gucken.
Wenn du mit Element ein Element in einer LinkedList meinst, dann ja, dieser Pointer ist so lange valide bis das Element gelöscht wird.
Pointer zu Memory-Buffern oder Strings bleiben auch solange valide bis sie wieder freigeben werden oder du mit ReAllocateMemory oder durch ändern des Strings die Größe änderst.
Bei Pointer die von DrawingBuffer() u.ä. zurückgegeben werden, sind Zeitlich begrenzt, in dem Fall z.B. bis StopDrawing() aufgerufen wird.
Bei externen Pointer müsstest du in deren Dokumentationen gucken.
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: Wie lange bleiben Zeiger bestehen?
Zeiger bleiben so lange gültig, solange das Objekt, Element, Speicher (Allocate- Memory Structure) existiert.
Bei ReAllocateMemory must du den Zeiger neu zuweisen, da sich Adresse im Speicher sich ändern kann.
Wenn du Zeiger auf Elemente verwendest, must du selber prüfen, nach DeleteElement oder DeleteMapElement, ob der Zeiger noch gültig ist .
Bei ReAllocateMemory must du den Zeiger neu zuweisen, da sich Adresse im Speicher sich ändern kann.
Wenn du Zeiger auf Elemente verwendest, must du selber prüfen, nach DeleteElement oder DeleteMapElement, ob der Zeiger noch gültig ist .
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Wie lange bleiben Zeiger bestehen?
Vielen Dank für die schnellen Antworten! Dann ist es doch im Wesentlichen so, wie ich ursprünglich dachte.
Aber das ist nur wichtig, wenn ich das Element lösche, auf das der Zeiger verweist, oder? Angenommen ich verweise auf ein Element meiner Liste und lösche ein anderes und füge wieder ein neues hinzu, sollte der Zeiger nach wie vor funktionieren, oder?Wenn du Zeiger auf Elemente verwendest, must du selber prüfen, nach DeleteElement oder DeleteMapElement, ob der Zeiger noch gültig ist .
Re: Wie lange bleiben Zeiger bestehen?
Ja, bei Listen und Maps wird nichts verschoben. Es ändern sich nur intern die Zeiger auf das nächste oder vorherige Element.
Code: Alles auswählen
Structure struct_list_header
*NextItem.struct_list_header ;* Pointer to next element in list or zero if at last element
*PrevItem.struct_list_header ;* Pointer to previous element in list or zero if at first element
EndStructure
Structure struct_data
iVal1.i
ival2.i
EndStructure
Structure struct_list_data
Header.struct_list_header
Values.struct_data
EndStructure
Macro GetListFirstItem(_List_)
FirstElement(_List_) - SizeOf(struct_list_header)
EndMacro
Macro GetElement(_List_)
(@_List_ - SizeOf(struct_list_header))
EndMacro
Global NewList MyData.struct_data()
For i = 1 To 5
AddElement(MyData())
Mydata()\iVal1 = 100 + i
Mydata()\iVal2 = 200 + i
Debug "Element = " + @MyData() + " Header = " + Str(@MyData() - SizeOf(struct_list_header))
Next
Debug "----"
*plist.struct_list_data = GetListFirstItem(MyData())
SelectElement(MyData(), 2)
DeleteElement(MyData())
With *plist
Repeat
Debug "PrevItem = " + \Header\PrevItem
Debug "NextItem = " + \Header\NextItem
Debug "Value 1 = " + \Values\iVal1
Debug "Value 2 = " + \Values\iVal2
If \Header\NextItem
*plist = \Header\NextItem
Debug "----"
Else
Break
EndIf
ForEver
EndWith
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Wie lange bleiben Zeiger bestehen?
Vielen Dank!