Problem mit einem Array

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Hubsi

Betreff: Problem mit einem Array

BeitragMo, Okt 03, 2016 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Schönen guten Tag Smile

Ich möchte einem zweidimensionalen Array eine neue Größe zuweisen. Der letzte Stand meiner Bemühungen ist folgender:

BlitzMax: [AUSKLAPPEN]
Local map_gfx:TImage[100, 2], map_data:Byte[0, 0]
' map_data wird erstellt, die endgültige Größe weiß ich noch nicht und kann sich im Laufe des Programms auch ändern

'weiter unten dann:
map_data = map_data[..x, y]


So hab ichs mir aus der Hilfe in BLIde zusammengefrickelt und nach letzter Überlegung als syntaktisch richtig erachtet. Nur Blitz will das nicht einsehen Very Happy Was mache ich falsch?
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

DAK

BeitragMo, Okt 03, 2016 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub ehrlich nicht, dass zweidimensionale Arrays slicing zulassen. Verwend doch besser ein Array-of-Arrays.


Edit:
Wenn du deine letzte Zeile änderst auf
BlitzMax: [AUSKLAPPEN]
map_data = map_data[..x]

dann zeigt dir BMax eine bessere Meldung dazu:
Zitat:
Compile Error

Slices can only be used with strings or one dimensional arrays
Gewinner der 6. und der 68. BlitzCodeCompo

FireballFlame

BeitragMo, Okt 03, 2016 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK hat recht, mehrdimensionale Arrays sind für sowas nicht gedacht; benutz lieber verschachtelte Arrays.

Zur Erklärung:
Mehrdimensionale Arrays (anders als verschachtelte, also Arrays von Arrays) werden intern als eindimensionale Arrays behandelt, was man z.B. sehen kann, wenn man sie sich mit dem Debugger anschaut. Die enthaltenen Werte liegen alle hintereinander im Speicher, wobei die einzelnen Index-Dimensionen praktisch von hinten nach vorne durchlaufen werden; d.h. z.B. bei einem 2D-Array mit der Größe [3,3] liegen die Elemente in der Reihenfolge [0,0], [0,1], [0,2], [1,0], [1,1], [1,2], [2,0], [2,1], [2,2].
Würdest du nun versuchen, die Größe der 2. Dimension zu ändern, müsste das Array dazu in lauter kleine Teile zerstückelt und neu zusammenfügt werden, z.B. so: [0,0], [0,1], [0,2], [0,3], [1,0], [1,1], [1,2], [1,3], [2,0], [2,1], [2,2], [2,3]. Beim Verkleinern müssten beim Zusammenfügen einige der Originalteile ausgelassen, beim Vergrößern neue Teile zwischen den anderen eingefügt werden. Das wäre aber sehr ineffizient, daher gibt es diese Funktionalität in BlitzMax nicht.

(Die einzige Ausnahme wäre die vorderste Dimension. Dort gibt es das Problem nicht, denn um deren Größe zu ändern müsste wie beim 1D-Array nur was vom Gesamtarray abgeschnitten bzw. daran angehängt werden. Das könnte man auch durchaus mit Trickserei erreichen (neues Array erstellen und Inhalt mit MemCopy rüberkopieren, oder die BlitzMax-internen Array-Funkionen manuell aufrufen), aber das ist nur empfehlenswert, wenn man wirklich weiß, was man tut, und normalerweise den Aufwand eh nicht wert.)

Hubsi

BeitragDi, Okt 04, 2016 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank Very Happy Dann muss ich sehen was man tun kann Smile

Edit:

Bin jetzt gerade zufällig über eine Lösung gestolpert:
BlitzMax: [AUSKLAPPEN]
Local mein_array:Int[1,1,1]

' Neue Größe
mein_array=New Int [100,100,3]


Vielleicht hilfts nochmal jemandem weiter Very Happy

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group