Map() merkwürdiges Verhalten

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
maddinvonfritz
Beiträge: 12
Registriert: 15.11.2023 16:53

Map() merkwürdiges Verhalten

Beitrag von maddinvonfritz »

Hallo ich benutze für ein Projekt TreeEx von @Thorsten1867
Ich bekomme aber unregelmäßig den Fehler Die Map hat kein Aktuelles Element.

Code: Alles auswählen

Procedure   DrawScrollButton_(X.i, Y.i, Width.i, Height.i, ScrollBar.s, Type.i, State.i=#False)
 Define.i Color, Border
 Debug "DrawScrollButton_1: " + MapKey(TreeEx())
  If StartDrawing(CanvasOutput(TreeEx()\CanvasNum))
   Debug "DrawScrollButton_1.1: " + MapKey(TreeEx())
   DrawingMode(#PB_2DDrawing_Default)
Nach ein bisschen Debuggen bin ich auf das gestossen.

Beim ersten Debug ist die Ausgabe 25 wie es sein soll. Beim zweiten Debug kommt ein leerer String.
Hat jemand eine Idee was das sein könnte?
Bin auf Windows 10 unterwegs mit 6.11 und 6.12
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
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

Re: Map() merkwürdiges Verhalten

Beitrag von NicTheQuick »

Ein funktionierendes Beispiel um das Problem nachzuvollziehen wäre praktisch.
Deshalb kann ich nur raten: Nutzt du Threads?
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Map() merkwürdiges Verhalten

Beitrag von H.Brill »

Muß man diese Maps nicht erst auf Anfang setzen und dann durchhangeln, wie es in der
Hilfe auch gezeigt wird ?

Code: Alles auswählen

NewMap Country.s()

  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"

  ResetMap(Country())
  While NextMapElement(Country())
    Debug Country()
  Wend
Dein Code oben gibt ja als Fragment nicht viel her.
Aufs Geradewohl zuzugreifen, denke ich eher nicht.
PB 6.10
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Map() merkwürdiges Verhalten

Beitrag von HeX0R »

H.Brill hat geschrieben: 23.09.2024 18:38 Muß man diese Maps nicht erst auf Anfang setzen und dann durchhangeln, wie es in der
Hilfe auch gezeigt wird ?
Also dann wären Maps ziemlich nutzlos
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: Map() merkwürdiges Verhalten

Beitrag von Andre »

"Durchhangeln" muss man Maps wirklich nicht, dann gäbe es für diese ja wirklich keinen sinnvollen Anwendungszwecks und man könnte verkettete (linked) Lists verwenden.

Siehe auch Beschreibung zur Map-Bibliothek - da wird auch das Thema mit den Threads (es können nicht mehrere gleichzeitig auf die Map zugreifen) im letzten Satz aufgegriffen: https://www.purebasic.com/german/docume ... index.html

Ansonsten wie oben schon gesagt: es bräuchte ein lauffähiges Beispiel, um wirklich helfen zu können.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
maddinvonfritz
Beiträge: 12
Registriert: 15.11.2023 16:53

Re: Map() merkwürdiges Verhalten

Beitrag von maddinvonfritz »

Danke für die Antworten. Auf Threads bin ich jetzt gar nicht gekommen.
In dem Modul wird wirklich ein Thread gestartet und wenn ich diesen Auskommentiere scheint es zu laufen. Warum muss ich mir morgen mal Ansehen.
Das würde auch erklären warum der Fehler an so merkwürdigen stellen auftritt.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
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

Re: Map() merkwürdiges Verhalten

Beitrag von NicTheQuick »

Wenn du Threads nutzt, solltest du erstens auch ThreadSafe in der Compiler-Optionen aktivieren, und zweitens einen Mutex nutzen um alle Objekte zu schützen, die von den Threads gleichzeitig benutzt werden.
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: Map() merkwürdiges Verhalten

Beitrag von Lord »

Hallo!

Ich war nach dem Umstieg auf PB v6.11 auf ein ähnliches Problem gestoßen.
Ich habe mich beholfen mit einer Dummyzuweisung.
Vorher bei mir:

Code: Alles auswählen

ForEach Person()
  If Dokumente(Person()\IDEN\ENTRY)\Kir\Birt
    ...
  EndIf
  ...
Next
Danach:

Code: Alles auswählen

ForEach Person()
  dummy=Dokumente(Person()\IDEN\ENTRY); <---------
  If Dokumente(Person()\IDEN\ENTRY)\Kir\Birt
    ...
  EndIf
  ...
Next
Ich habe da nicht weiter nachgeforscht, warum das jetzt so ist.
Hauptsache es funktionierte.
Versuch also mal einfach

Code: Alles auswählen

Dummy=TreeEx()\CanvasNum)
Schaden kann's nicht.
Bild
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Map() merkwürdiges Verhalten

Beitrag von jacdelad »

Lord hat geschrieben: 25.09.2024 09:58 Hallo!

Ich war nach dem Umstieg auf PB v6.11 auf ein ähnliches Problem gestoßen.
Ich habe mich beholfen mit einer Dummyzuweisung.
Vorher bei mir:

Code: Alles auswählen

ForEach Person()
  If Dokumente(Person()\IDEN\ENTRY)\Kir\Birt
    ...
  EndIf
  ...
Next
Danach:

Code: Alles auswählen

ForEach Person()
  dummy=Dokumente(Person()\IDEN\ENTRY); <---------
  If Dokumente(Person()\IDEN\ENTRY)\Kir\Birt
    ...
  EndIf
  ...
Next
Ich habe da nicht weiter nachgeforscht, warum das jetzt so ist.
Hauptsache es funktionierte.
Versuch also mal einfach

Code: Alles auswählen

Dummy=TreeEx()\CanvasNum)
Schaden kann's nicht.
Das Problem habe ich nicht. Ich kann mir nur vorstellen, dass du, wie Nic schon anmerkte, Threads benutzt und sie nicht richtig absicherst. Kannst du ein Minimalbeispiel posten, was bei dir dieses falsche Verhalten zeigt?
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Axolotl
Beiträge: 272
Registriert: 31.12.2008 16:34

Re: Map() merkwürdiges Verhalten

Beitrag von Axolotl »

Ich würde sagen, dass es kein aktuelles Element gibt, von dem der Schlüssel zurückgegeben wird. Kein aktuelles Element, dann Rückgabewert = Leerer String..
Das wäre z.B. möglich, wenn das erste Element oder ein einzelnes Element mit DeleteMapElement() gelöscht wird oder nach ResetMap() oder .....
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Antworten