[Idee] FOREACH-Schleife optional mehrdimensional durchlaufen

Previous topic - Next topic

backslider

Hi Leute,

meint ihr - auch wenn es nicht ganz "programmierkonform" ist - es wäre eine gute Idee,
die FOREACH-Schleife optional auch z.B. in mehrdimensionalen Types durch alle Dimensionen zu jagen?

Normal wird ja immer nur die erste Dimension durchlaufen.

Beispiel:
Code (glbasic) Select

TYPE test
ENDTYPE

LOCAL arr[] as test
DIM arr[10][10]

MULTIDIMFOREACH blub in arr[] //oder so ;)
//alle xy-Dimensionen durchlaufen...
NEXT

//Aktuelle und eigentlich normale "Alternative" mit mehr Schreibaufwand
FOR i%=0 TO 9
    FOR j%=0 TO 9

    NEXT
NEXT


Wenns 'ne schlechte Idee ist, vergebt mir.  :whistle:  :nana:

MfG

Quentin

ähh, wie soll das denn gehen? Wie soll dein MULTIFOREACH denn wissen, welche Dimension zuerst durchlaufen werden soll?
Was spricht bei mehrdimensionalen Arrays gegen geschachtelte FOREACH-Schleifen?

Code (glbasic) Select

DIM arr[10][10]

FOREACH bla in arr[]
    FOREACH blub in arr[bla][]
        ...processing...
    NEXT
NEXT

backslider

Ach so habe ich das noch gar nicht probiert...  :D
Das ist natürlich das, was ich gesucht habe.

Danke! ;)

Kitty Hello



monono

Die Idee ist schick. Leider ignoriert sowohl FOREACH als auch LEN() die erste Dimension und nimmt immer die 0 an. Bleibt wohl nur ein nested loop. Und bla ist natürlich kein Index sondern ein Inhalt :).

:offtopic:
Wo wir hier gerade bei Wünschen für die Sprache sind: Ich wünsche mir casting. Hab schon angefangen alle meine Types in ein Muttertype zu stecken, was alle Typesorten beinhalten kann :S.

Quentin

lol
ja, das geht net. Wäre aber prinzipiell nicht schlecht.

ein

FOREACH bla IN arr[][]

müsste dann erlaubt sein. Die Schleife könnte dann

arr[0][0]
arr[0][1]
...
arr[0][9]
arr[1][0]
...

durchlaufen.

Kitty Hello

sollte machbar sein. Hat jemand ein praktisches Beispiel dazu?

Schranz0r

Eine Map als Type:
Code (glbasic) Select

TYPE Tile
    spr_id%
    ...   
    FUNCTION Blub:
        ...
    ENDFUNCTION
ENDTYPE

GLOBAL Map[] AS Tile
REDIM  Map[10][10]

...

FOREACH t IN Map[]
    t.Blub() // zb zeichen oder sowas
NEXT
   


Würde ich auch gut finden! :)
Macht nen sehr schönen und vorallen übersichtlichen Code.
Wie man allerdings dann auf die verschiedenen Felder zugreifen kann, oder soll .... Hmmmmm :)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

backslider

@Schranz0r: Genau bei dem Beispiel bin ich auf die Idee gekommen... :D

Auf die einzelnen Felder zugreifen geht dann natürlich erstmal nicht so einfach, aber das braucht man auch nicht immer.

Kitty Hello

OK, ich hab das mal eingebaut und es umgeht damit auch die BOUNDS() Prüfung des Arrays (Ich weiß die Größe ja und bin sicher, dass hier nichts daneben geht).
Das sollte also auch bisserl schneller werden.


Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Markus

Habs grad gelesen.

Warum überhaupt Mehrdimensional?
Bei der Tilemap z.B. brauch das Tile was gemalt werden soll doch nur die x,y Pos.
Kann dann doch alles in eine Liste.



backslider

Z.B. weils in einer FOREACH irrelevant sein sollte (in einem Basic), wie viele Dimensionen man hat.
Da es schon oft passiert ist, dass Leute sich gefragt haben, wieso jetzt nur die erste Zeile angezeigt wird. ;)

Und es ist einfach bequemer.