Hallo,
Beim Erstellen des Beispiels bin ich auf einen Fehler gestoßen. Hier ein Beispiel:
Code: Alles auswählen
EnableExplicit
Structure tJOB
JobID.i
JobKey.s
*Parent.tJOB_CATEGORY
DataType.i
DataSize.i
*JobData
EndStructure
Structure tJOB_CATEGORY
CategoryName.s
List Jobs.tJOB()
EndStructure
Global NewMap JobCategories.tJOB_CATEGORY()
Global NewMap *Jobs.tJOB()
Procedure AddJob( Category.s, JobData )
Static JobID
Protected JobKey.s
Protected *Category.tJOB_CATEGORY, *NewJob.tJOB
*Category = FindMapElement( JobCategories(), Category )
If Not *Category
*Category = AddMapElement( JobCategories(), Category )
*Category\CategoryName = Category
EndIf
Repeat
JobID + 1
JobKey = Str(JobID)
Until Not FindMapElement( *Jobs(), JobKey )
*NewJob = AddElement( *Category\Jobs() )
*Jobs( JobKey ) = *NewJob
; With *NewJob
; With *Category\Jobs()
With *Jobs( JobKey )
\JobID = JobID
\JobKey = JobKey
\JobData = JobData
\Parent = *Category
EndWith
ProcedureReturn JobID
EndProcedure
AddJob( "IDLE", Random( $FFFF ) )
AddJob( "DEFAULT", Random( $FFFF ) )
AddJob( "IDLE", Random( $FFFF ) )
AddJob( "HIGH", Random( $FFFF ) )
AddJob( "HIGH", Random( $FFFF ) )
AddJob( "HIGH", Random( $FFFF ) )
AddJob( "IDLE", Random( $FFFF ) )
AddJob( "DEFAULT", Random( $FFFF ) )
AddJob( "HIGH", Random( $FFFF ) )
AddJob( "HIGH", Random( $FFFF ) )
AddJob( "HIGH", Random( $FFFF ) )
AddJob( "IDLE", Random( $FFFF ) )
AddJob( "DEFAULT", Random( $FFFF ) )
Debug LSet("",100,"-")
Debug "Access to jobs over the lists in the category structure."
Debug "The categories are maintained in a map JobCategories()."
ResetMap( JobCategories() )
While NextMapElement( JobCategories() )
With JobCategories()
Debug Str(ListSize(\Jobs())) + " jobs in category " + JobCategories()\CategoryName
ForEach \Jobs()
Debug " Job " + Str(\Jobs()\JobID) + " // JobData = " + Str(\Jobs()\JobData) + " // cateogory = " + \Jobs()\Parent\CategoryName
Next
EndWith
Wend
Debug ""
Debug LSet("",100,"-")
Debug "Access to the list items over the pointers,"
Debug "which are stored in the map *Jobs()"
Debug "Access to single items is possible using the JobID!"
ResetMap( *Jobs() )
While NextMapElement( *Jobs() )
With *Jobs()
Debug "-"
Debug "MapKey = " + MapKey(*Jobs())
Debug "JobKey = " + \JobKey
; ==> VERY STRANGE: only empty lines are print to the debug window!
Debug "JobID = " + Str(\JobID)
Debug "Data = " + Str(\JobData)
Debug "Parent = " + Str(\Parent)
EndWith
Wend
Die einzelnen Elemente der Liste in der Struktur tJOB_CATEGORY enthalten jeweils die Job-Informationen. Größe eines Listenelements entspricht SizeOf(tJOB).
Zusätzlich wird ein Zeiger auf jedes Job-Element (kategorie-übergreifend) in der Map *Jobs.tJob() gespeichert. Die einzelnen Elemente der Map haben jedoch die Größe eines Zeigers (Integer) und nicht die Größe SizeOf(tJOB), da der Map-Name mit "*" beginnt. Es handelt sich also um eine Map von Zeigern auf tJOB-Elemente.
Leider gibt es beim Zugriff auf die einzelnen Job-Elemente über die Map einen Fehler. Da werden die falschen Daten geliefert, obwohl innerhalb der Funktion AddJob() die Daten über den Map-Zeiger gesetzt werden und dann auch richtig über direkten Zugriff auf die Listenelemente auch richtig ausgelesen werden.
Da scheint es einen Bug zu geben.
Ist das jetzt etwas verständlicher?
Es ging mir als nicht um die Möglichkeit Listen/Arrays/Maps innerhalb von Strukturen zu verwenden, sondern darum neben "
strukturierten Listen/Arrays/Maps" eben auch "Listen/Arrays/Maps von Zeigern auf Strukturen" zu erstellen, auf die strukturiert zugegriffen werden kann.
cu,
guido