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
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.
Scheint auch ganz gut zu funktionieren. Ich hoffe nur, dass das "Map-Management" nicht durcheinandergebracht wird.
Eventuelle Nutzung auf eigene Gefahr...
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.

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")