Seite 2 von 2

Re: kleine Erweiterung für Maps

Verfasst: 04.04.2011 01:33
von CSHW89
Ich hab auch grad an deine Erweiterung gedacht. Wiedermal ein Code von dir, der sinnlos wird :mrgreen:
http://www.purebasic.fr/german/viewtopi ... 71&start=5

Re: kleine Erweiterung für Maps

Verfasst: 06.04.2012 20:15
von Regenduft
Danke! Das hat mich auf den richtigen für mein "RenameMapKey()" gebracht. :allright:

Scheint auch ganz gut zu funktionieren. Ich hoffe nur, dass das "Map-Management" nicht durcheinandergebracht wird.
Eventuelle Nutzung auf eigene Gefahr... :wink:
EDIT: Die Sorgen waren gerechtfertigt. Der folgende Code funktioniert so nicht! (siehe nächtes Posting von STARGÅTE)

Code: Alles auswählen

EnableExplicit

Macro RenameMapKey(Map, Key, NewKey)
  _RenameMapKey(FindMapElement(Map,Key), Key, @NewKey)
EndMacro
Procedure.i _RenameMapKey(*Pointer.String, Key$, *NewKey)
  If *Pointer
    *Pointer - SizeOf(Integer)
    Protected *ToNewKey.String = @*NewKey
    Swap *Pointer\s, *ToNewKey\s
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

NewMap bla.s()

bla("US") = "United States"
bla("FR") = "France"
bla("DE") = "Germany"

Debug RenameMapKey(bla(), "US", "XYZTrulala")
Debug MapKey(bla())
Debug ""

ForEach bla()
  Debug MapKey(bla())+" = "+bla()
Next
Anmerkung: Das ich "US" zu "XYZTrulala" verunstaltet habe hat nichts weiter zu bedeuten. :wink:

Re: kleine Erweiterung für Maps

Verfasst: 07.04.2012 01:05
von STARGÅTE
@Regenduft:
Diese Variante ist leider nicht möglich, wenn nicht sogar ein schwerer Fehler!

Die Map-Keys sind nicht nur einfach Strings, sondern Einträge einer Tabelle zur suche des Elements, wenn ein Key gesucht wird. Eine Map durchsucht ja nicht alle Elemente und vergleich die Keys, sondern nutzt eben eine Hash-Tabelle.

Nachdem der Key verändert wurde, kann man weder über den alten noch über den neuen Key zugreifen, wie du an diesem Beispiel siehst:

Code: Alles auswählen

EnableExplicit

Macro RenameMapKey(Map, Key, NewKey)
  _RenameMapKey(FindMapElement(Map,Key), Key, @NewKey)
EndMacro
Procedure.i _RenameMapKey(*Pointer.String, Key$, *NewKey)
  If *Pointer
    *Pointer - SizeOf(Integer)
    Protected *ToNewKey.String = @*NewKey
    Swap *Pointer\s, *ToNewKey\s
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

NewMap bla.s()

bla("US") = "United States"
bla("FR") = "France"
bla("DE") = "Germany"

RenameMapKey(bla(), "US", "XYZTrulala")

Debug bla("US")
Debug bla("FR")
Debug bla("DE")
Debug bla("XYZTrulala")