Re: Die nächstkleinste freie Zahl in einer Liste finden
Verfasst: 13.06.2014 07:41
So... Nun hab ich mal das, was ich verstanden habe zusammengewürfelt und es kam folgendes dabei raus :
Die Idee mit den ElapsedMilliseconds() ist gut
Nichts für ungut Nic, aber durch dein komplettes Beispiel steig ich noch nicht durch.
Ich bedanke mich für die Mühen, die ich gemacht habe ^^
Code: Alles auswählen
DeclareModule mObjectID
Declare IsID(Type.s, ID)
Declare NewID(Type.s, *Memory, ID = #PB_Any)
Declare FreeID(Type.s, ID)
EndDeclareModule
Module mObjectID
EnableExplicit
Structure struct_oID
Map ID.i()
EndStructure
Global NewMap object.struct_oID()
Procedure _NewDynamic(Type.s)
; DrShrek : Ermittelt einen Key anhand der vergangenen Millisekunden
Protected Result, Key.s
Repeat
Key.s = Str(ElapsedMilliseconds() + 10000) ; Sichergehen, dass die vergangene Zeit auch über 10000 liegt)
Result = FindMapElement(object(Type)\ID(), Key)
Until Not (Result)
ProcedureReturn Val(Key)
EndProcedure
Procedure IsID(Type.s, ID)
; Prüft, ob eine ID schon vorhanden ist
If FindMapElement(object(Type)\ID(), Str(ID))
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure NewID(Type.s, *Memory, ID = #PB_Any)
Protected Result = -1, Key.s = ""
If *Memory
If ID = #PB_Any
Result = _NewDynamic(Type) ; Eine ElapsedMilliseconds() ID
object(Type)\ID(Str(Result)) = *Memory ; Den übergebenen Speicher anhängen
ElseIf ID >-1 And ID<10001 ; Wenn eine Gültige Statische ID
; Hier noch Check wegen evt FreeMemory usw.
object(Type)\ID(Str(ID)) = *Memory ; Den übergebenen Speicher anhängen
Result = ID
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure FreeID(Type.s, ID)
If FindMapElement(object(Type)\ID(), Str(ID))
; Hier noch Check wegen evt FreeMemory usw.
DeleteMapElement(object(Type)\ID(), Str(ID))
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
EndModule
Debug mObjectID::NewID("ftp", 1, #PB_Any)
Debug mObjectID::NewID("ftp", 1, #PB_Any)
a = mObjectID::NewID("ftp", 1, #PB_Any)
Debug a
Debug mObjectID::NewID("ftp", 1, #PB_Any)
Debug mObjectID::NewID("ftp", 1, 12)
Debug mObjectID::NewID("ftp", 1, 11)
Debug mObjectID::NewID("ftp", 1, 10)
Debug mObjectID::FreeID("ftp", 12)
Debug "..."
Debug mObjectID::IsID("ftp", a)
Debug mObjectID::FreeID("ftp", a)
Debug mObjectID::IsID("ftp", a)
Debug mObjectID::IsID("ftp", 11)Nichts für ungut Nic, aber durch dein komplettes Beispiel steig ich noch nicht durch.
Ich bedanke mich für die Mühen, die ich gemacht habe ^^