doppeltes foreach der selben liste?
doppeltes foreach der selben liste?
hi, bin noch anfänger mit der programmierung, habe es früher schonmal versucht, musste aber aufgeben :(
ich wollte ein "sternsystem" programmieren, das jeder stern / planet von anderen angezogen wird, und sie anzieht.
lief ganz gut, bis ich nicht wusste wie ich machen kann das alle elemente in einer liste sich gegenseitig abfragen. wenn ich 2 unterschiedliche listen habe die sich gegenseitig abragen wollen, mache ich einfach foreach liste1 und dann foreach liste2
aber ich will ja foreach liste1, foreach liste1, aber er kann ja dann nicht wissen welches der beiden ich meine wenn ich ein element aufrufe.
gibt es dafür einen bestimmten befehl oder so? oder ein trick?
das was ich bisher habe habe ich jetzt nicht vorliegen, bin an einen anderen computer, und an meinen ist grade das i-net kaputt :(
ich wollte ein "sternsystem" programmieren, das jeder stern / planet von anderen angezogen wird, und sie anzieht.
lief ganz gut, bis ich nicht wusste wie ich machen kann das alle elemente in einer liste sich gegenseitig abfragen. wenn ich 2 unterschiedliche listen habe die sich gegenseitig abragen wollen, mache ich einfach foreach liste1 und dann foreach liste2
aber ich will ja foreach liste1, foreach liste1, aber er kann ja dann nicht wissen welches der beiden ich meine wenn ich ein element aufrufe.
gibt es dafür einen bestimmten befehl oder so? oder ein trick?
das was ich bisher habe habe ich jetzt nicht vorliegen, bin an einen anderen computer, und an meinen ist grade das i-net kaputt :(
Soweit ich das verstehe willst du also jedes Element einer Liste mit jedem anderen "durchrechnen" und zwar genau einmal pro möglicher Kombination.
Falls das stimmt, kuck dir mal das da an (Innerhalb der beiden Schleifen mit idx1 und idx2 als Index für die Liste arbeiten. Die Debugausgabe sollte verdeutlichen was gemeint ist):
edit: unnötige Structure rausgenommen... mei bin ich fertisch...
Falls das stimmt, kuck dir mal das da an (Innerhalb der beiden Schleifen mit idx1 und idx2 als Index für die Liste arbeiten. Die Debugausgabe sollte verdeutlichen was gemeint ist):
Code: Alles auswählen
; Kombinatorik - jede mögliche Paarkonstellation einer Liste
NewList MyList.s()
AddElement(MyList())
MyList() = "a"
AddElement(MyList())
MyList() = "b"
AddElement(MyList())
MyList() = "c"
AddElement(MyList())
MyList() = "d"
For idx1 = 0 To ListSize(MyList()) - 2
For idx2 = idx1 + 1 To ListSize(MyList()) - 1
SelectElement(MyList(), idx1)
ding1.s = MyList()
SelectElement(MyList(), idx2)
ding2.s = MyList()
Debug ding1 + " " + ding2 ; hier spielt die Musik!
Next
Next
falls die Listen größer werden ist ein SelectElement unglaublich langsam,
bessere variante ist:
Das erlaubt auch schnelleren Zugriff auf die ElementStructureVariablen
bessere variante ist:
Code: Alles auswählen
Structure Stern
Masse.f
x.f
y.f
EndStructure
NewList Stern.Stern()
For n = 1 To 5
AddElement(Stern())
Stern()\Masse = n
Next
; Jedes mit jedem (ein mal)
ForEach Stern()
*Stern1.Stern = Stern()
While NextElement(Stern())
*Stern2.Stern = Stern()
; Ausgabe der beiden Sterne:
Debug "Kombination: "+Str(*Stern1\Masse)+" mit "+Str(*Stern2\Masse)
Wend
ChangeCurrentElement(Stern(), *Stern1)
Next
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Ob du Stern()\Masse schreibst oder es mit Pointern umsetzt macht keinen Unterschied, ist reine Geschmackssache.Kaisky007 hat geschrieben:das heißt, ich kann dann ganznormal alles hinschreiben wo du debug hast, nur immer statt Stern()\Masse *Stern1\Masse ???
Windows 10 Pro, 64-Bit / Outtakes | Derek
also wenn du EINE EINZIGE Liste mit sich selber vergleichen willst, dann brauchst du POINTER also die *
die die Position des Elements speichert.
Wenn du nur Sterne hast dann reicht halt eine Liste, falls du sie in Proceduren verwenden willst, wäre Global nicht schlecht.
Aber eine Liste reicht halt um die Sterne sich anziehen zu lassen ...
die die Position des Elements speichert.
Wenn du nur Sterne hast dann reicht halt eine Liste, falls du sie in Proceduren verwenden willst, wäre Global nicht schlecht.
Aber eine Liste reicht halt um die Sterne sich anziehen zu lassen ...
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Nö.STARGÅTE hat geschrieben:also wenn du EINE EINZIGE Liste mit sich selber vergleichen willst, dann brauchst du POINTER also die *
die die Position des Elements speichert.

Code: Alles auswählen
Structure Stern
Masse.f
x.f
y.f
EndStructure
NewList Stern.Stern()
For n = 1 To 5
AddElement(Stern())
Stern()\Masse = n
Next
; Jedes mit jedem (ein mal)
ForEach Stern()
altStern = Stern()
altMasse = Stern()\Masse
While NextElement(Stern())
; Ausgabe der beiden Sterne:
Debug "Kombination: "+ Str(altMasse) + " mit " + Str(Stern()\Masse)
Wend
ChangeCurrentElement(Stern(),altStern)
Next
Windows 10 Pro, 64-Bit / Outtakes | Derek
jo klar, das war auch meine "alte" Variante damals,
aber inzwischen habe die die Pointer schätzen gelernt...
Es ist einfach kürzer ...
aber inzwischen habe die die Pointer schätzen gelernt...
Es ist einfach kürzer ...
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr