Seite 1 von 2

Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 09:11
von helpy
Hallo zusammen,

Ich habe das bei einer ersten Suche hier im Forum nicht gefunden! Vielleicht habe ich es auch übersehen!

Ich fragte mich, ob es möglich ist, Maps/Listen/Arrays zu erstellen, die Zeiger auf Strukturen enthalten und wo die Elemente direkt ansprechbar sind.

Bisher hatte ich das immer so gemacht:

Code: Alles auswählen

Structure tStruct
	a.l
	b.l
	c.s
	d.i
EndStructure

NewMap pMap.i()
NewList pList.i()
Dim pArray.i(10)

Define *element.tStruct
Mit *element.tStruct = Map/List/Array-Element konnte ich dann auf das Element zugreifen.

Nun habe ich mich gefragt, ob es möglich ist, das auch direkt zu machen? Also habe ich folgendes getestet:Das würde dann so aussehen:

Code: Alles auswählen

Structure tStruct
	a.l
	b.l
	c.s
	d.i
EndStructure

NewMap *pMap.tStruct()
NewList *pList.tStruct()
Dim *pArray.tStruct(10)
Und siehe da: Das funktioniert :-)

Ist das irgendwo dokumentiert?

Für den ein oder anderen mag das ja nichts neues sein ... aber ich war positiv überrascht von PureBasic ;-)

cu,
helpy

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 10:13
von ralle
Das was du dort beschreibst steht so direkt in der Hilfe von PB. Unter Listen steht beschrieben, dass der Typ auch Strukturen sein dürfen und bei Strukturen steht, dass diese neuerdings auch Listen enthalten dürfen. Geht also links wie rechts rum und ist meiner Ansicht nach nicht sonderlich überraschend...

mfG
Ralph

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 11:30
von STARGÅTE
SRy aber diese Information hat wirklich nichts in "Code, Tipps und Tricks" zu suchen.
Zum einen fehlt ein ausführbarer Beispielcode!
Zum andere ist (jedenfalls mir) nicht ganz klar, ob du das gleiche Meinst, wie die, die es gerade lesen!

Deine Idee läuft darauf hinaus:

Code: Alles auswählen

Structure tStruct
   a.l
   b.l
   c.s
   d.i
EndStructure

Variable1.tStruct
Variable1\b = 123

Variable2.tStruct
Variable2\c = "Cool"

Dim *pArray.tStruct(10)
*pArray(1) = @Variable1
*pArray(5) = @Variable2

Debug *pArray(5)\c
Debug *pArray(1)\b
Aber wenn man die Struktuierten Variablen eh selber erstellt, kann man das auch gleich direkt in der Liste/Map/Array machen.

Anfänger dir denken es geht hier nur darum ein Strukturiertes Array zu erzeugen fallen mächtig auf die Gesicht.

Code: Alles auswählen

Structure tStruct
   a.l
   b.l
   c.s
   d.i
EndStructure

Dim *pArray.tStruct(10) 

*pArray(1)\b = 123

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 12:59
von helpy
ralle hat geschrieben:Das was du dort beschreibst steht so direkt in der Hilfe von PB. Unter Listen steht beschrieben, dass der Typ auch Strukturen sein dürfen und bei Strukturen steht, dass diese neuerdings auch Listen enthalten dürfen. Geht also links wie rechts rum und ist meiner Ansicht nach nicht sonderlich überraschend...
Das weiß ich! Mir geht es um etwas anderes:

Es ist ein Unterschied zwischen NewList list1.tStruct() und NewList *tlist1.tSTruct() !!!

NewList list1.tStruct() ... legt eine Liste an, wo jedes Element die Größe der Struktur hat!

NewList *list1.tStruct() ... legt eine Liste an, wo jedes Element die Größe Integer hat und als Zeiger/Pointer auf eine Struktur verwendet werden kann.

cu, helpy

PS: Wenn das Eurer Meinung nicht hier her passt, dann verschiebt es bitte!
PSS: Für mich war das total neu und überraschend.

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 13:02
von helpy
STARGÅTE hat geschrieben:Aber wenn man die Struktuierten Variablen eh selber erstellt, kann man das auch gleich direkt in der Liste/Map/Array machen.
Anwendung: Ich habe bestimmte Objekte, die auf eine bestimmte Weise abgelegt sind!

Mit einer Map, kann ich ich nun eine Liste aller Objekte anlegen, in der alle bereits erzeugten Objekte referenziert sind und die ich dann mit einer ID schnell ansprechen kann!

cu,
helpy

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 13:03
von helpy
helpy hat geschrieben:
STARGÅTE hat geschrieben:Aber wenn man die Struktuierten Variablen eh selber erstellt, kann man das auch gleich direkt in der Liste/Map/Array machen.
Anwendung: Ich habe bestimmte Objekte, die auf eine bestimmte Weise strukturiert und verschachtelt abgelegt sind!

Mit einer Map, kann ich ich nun eine Liste all dieser Objekte anlegen, in der alle bereits erzeugten Objekte referenziert sind und die ich dann mit einer ID schnell ansprechen kann!

cu,
helpy

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 13:47
von STARGÅTE
helpy hat geschrieben: Anwendung: Ich habe bestimmte Objekte, die auf eine bestimmte Weise abgelegt sind!

Mit einer Map, kann ich ich nun eine Liste aller Objekte anlegen, in der alle bereits erzeugten Objekte referenziert sind und die ich dann mit einer ID schnell ansprechen kann!
Und warum postest du dann genau dieses Beispiel nicht ?
Ich meine was sollen die Leser aus dem ersten Beitrag für Informationen ziehen ?

Ich meine mir ist klar was du meinst. Ich selbst verwende sowas schon seit Jahren, ist mir also nicht neu.

Aber gerade weil es dir neu ist, solltest du den andere denen es auch neu ist, ein vernünftiges Beispiel geben.

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 15:06
von Vera
Rückmeldung einer Betroffenen:

im Moment schaffe ich es noch nicht, aus den hier verfügbaren Infos die Zusammenhänge von Strukturen/Maps/Listen/Arrays zurück zu schließen, oder eine Ahnung von den Neuerungen, geschweige denn, den Konsequenzen daraus zu erhalten.

Auch bei Stargates zweitem Codeschnipsel kann ich (noch) nicht einschätzen, ob es ein Beispiel für einen möglichen Anfängerfehler sein soll.

Und grade mit der Eröffnung - "bei einer .. Suche .. im Forum nicht(s) gefunden" - wären ein/zwei Beispiele hier besonders "helpy" ;)

Grüße ~ Vera

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 15:10
von helpy
OK! Ihr habt mich überzeugt ... werde ein Beispiel nachliefern!
lg, guido (alias helpy)

Re: Map/List/Array von Zeigern auf Strukturen

Verfasst: 16.07.2010 17:58
von helpy
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