Map/List/Array von Zeigern auf Strukturen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Map/List/Array von Zeigern auf Strukturen

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
ralle
Beiträge: 88
Registriert: 29.11.2004 17:50
Wohnort: Berlin

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag von helpy »

OK! Ihr habt mich überzeugt ... werde ein Beispiel nachliefern!
lg, guido (alias helpy)
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Map/List/Array von Zeigern auf Strukturen

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Antworten