Seite 1 von 1

bei Chancecurr.ele. nen falschen Pointer abzufragen?

Verfasst: 14.01.2008 23:20
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?

Verfasst: 15.01.2008 01:52
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:

Verfasst: 15.01.2008 23:47
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...

Verfasst: 15.01.2008 23:54
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:

Verfasst: 15.01.2008 23:57
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

Verfasst: 15.01.2008 23:59
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

Verfasst: 16.01.2008 11:13
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? :?

Verfasst: 16.01.2008 12:46
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.