bei Chancecurr.ele. nen falschen Pointer abzufragen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

bei Chancecurr.ele. nen falschen Pointer abzufragen?

Beitrag von Dostej »

Ich habe eine grundsätzliche Frage. Wie kann ich sicherstellen, das ich mit changecurrentelement ein gültiges Element erwischt habe. Also, wenn der Pointer z.B. falsch war, es das Element gar nciht gibt...

Code: Alles auswählen

Structure tst
  a.l
  b.l
  
EndStructure

NewList test.tst()


For x = 0 To 5
  AddElement(test())
  test()\a = x
Next

Debug "---3----"
SelectElement(test(), 3)
c = @test()
Debug ListIndex(test())
Debug test()\a

Debug "---1----"
SelectElement(test(), 1)
d = @test()
Debug ListIndex(test())
Debug test()\a

Debug "---c----"
ChangeCurrentElement(test(), c)
Debug ListIndex(test())
Debug test()\a

Debug "---514----"
ChangeCurrentElement(test(), 514)
Debug ListIndex(test())
Debug test()\a

Debug "---d----"
ChangeCurrentElement(test(), d)
Debug ListIndex(test())
Debug test()\a


End
Der Debugger gibt folgendes aus und meldet dann eine IMA.

Code: Alles auswählen

---3----
3
3
---1----
1
1
---c----
3
3
---514----
5

Das ist noch verständlich, gibt es das Element mit dem Pointer 514 gar nicht.
Aber das ListIndex(test()) 5 zurückgibt stimmt mit verwirrlich :?


Ist das so beabsichtigt. WEnn ja, habe ich praktisch keien Möglichkeit, nach einem changecurrentelement zu prüfen, ob die Liste nun auf ein gültiges Element weisst.

Oder hab ich nen Denkfehler drin?
Gibts ne andere Möglichkeit?
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ist man selber verantwortlich darauf zu achten auf ein gültiges Element zu wechseln.
Also immer auf ein zwischen gespeichertes nicht gelöschtest Element wechseln.

Sollte kein Problem sein.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Ja, aber das mit dem Listindex() finde ich komisch. Der könnte ja -1 zurückgeben, wenn ich den pointer falsch setze, dann könnte ich damit abfragen, ob ich ein gültiges Element habe...
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Mal die Hilfe gelesen "F1". Ist zum schnellen wiederherstellen des letzten aktuellen Elements um zu beispiel die Liste zwischendurch zu durchsuchen.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich hatte im englischen forum schonmal geschrieben, dass ChangeCurrentElement() was nützliches zurückgeben sollte.
(http://www.purebasic.fr/english/viewtopic.php?t=29298)
nco2k hat dann auch das mit der 0-rückgabe bei fehlschlag vorgeschlagen
my pb stuff..
Bild..jedenfalls war das mal so.
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

Beitrag von NicTheQuick »

Wenn du 'ChangeCurrentElement()' irgendeinen Pointer gibst und an der
Stelle im Speicher stehen zufällig Daten, die gültig sind, dann kann
'ListIndex()' natürlich nicht feststellen, dass das Element ungültig ist.

An dem Beispiel siehst du, dass durchaus noch nutzbare Daten im Speicher
bleiben:

Code: Alles auswählen

;Speicher allokieren
*a.Long = AllocateMemory(SizeOf(Long) * 100)
*b = *a

;Daten reinschreiben
For i = 0 To 99
  *a\l = i
  *a + SizeOf(Long)
Next

;Speicher wieder freigeben
FreeMemory(*b)

;Weniger Speicher als vorhin allokieren, damit alter Speicher überschrieben wird
AllocateMemory(SizeOf(Long) * 10)

;Trotzdem Daten abrufen
*a = *b
For i = 0 To 99
  Debug *a\l
  *a + SizeOf(Long)
Next
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

@#NUll -> Finde ich sehr sinnvoll. Hab auch mal meinen Senf dort dazu gegeben.

@Nick: Ja, stimmt. Aber das hat AFAIK nichts mit meiner Frage zu tun, oder?
Was hat das mit Listen und Changecurrentelement zu tun? :?
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

er meint nur, dass es für ChangeCurrentElement() vielleicht nicht unbedingt so einfach ist überhaupt festzustellen, ob der übergebene pointer wirklich auf ein gültiges listenelement zeigt (es sei den er ist 0). möglicherweise müsste die Elem.-structure von PB dazu zusätzliche infos erthalten.
z.b. angenommen du hast ein element deiner liste gelöscht, es ist also nicht mehr gültig, aber der freigegebe speicher wurde noch nicht überschrieben, so dass ChangeCE() dort gültige daten finden und so eine gültiges element annimt. oder du besitzt einen speicherblock mit daten, aber die haben nichts mit deiner liste oder deren elementen zu tun. wenn du nun den pointer an CCE() übergibst, könnte es passieren dass die enthaltenen daten für Pb wie ein listenelement aussehen.

ob das alles wirklich so schwierig ist weiß ich selbst aber nicht. wenn das pb-team sowas machen will wird es auch eine lösung dafür finden.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten