Arrays nachträglich vergrößern

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

DamienX

Betreff: Arrays nachträglich vergrößern

BeitragDo, Dez 22, 2005 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich weiß zwar eigentlich dass es normalerweise nicth möglich ist aber
kann ich Arrays nachträglich vergrößern?

Ich hab z.B. ein Array (map[map_x,map_y] wobei map_x und .._y jeweils 99 Felder haben!) und ich verkleiner das Array beim Laden einer Map
da ich ja nur die Tiles gezeichnet haben will die gespeichert werden...

Das Problem... wenn ich dann wieder eine Map laden möchte die
größer als die vorhergehende ist dann ist das Array wiederum zu klein!
Gibt es außer es mit Types zu machen eine Lösung?

Mfg DamienX

BtbN

BeitragDo, Dez 22, 2005 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Strict

Global meinarray:Byte[]

meinarray = New Byte[100,100]
'Jetzt hat es 100*100 Felder

meinarray = New Byte[200,200]
'Jetzt hats 200*200 Felder


Ob der Inhalt der alten Felder dabei erhalten bleibt, weiß ich nicht.

Mfg,
BORNtobeNAMELESS

d-bug

BeitragDo, Dez 22, 2005 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
...und noch eine Variante Smile

Code: [AUSKLAPPEN]
blablub[1] 'Array anlegen
blablub = blablub[..256] 'Array vegrößern


damit kannst du ein Array der Größe 1 auf 256 vergrößern...

Hab aber noch nicht probiert, ob das auch mit mehrdimensionalen Arrays funktioniert

greetz

BtbN

BeitragDo, Dez 22, 2005 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
oh, das wuste ich noch garnicht.
Aber:

BMax-Help hat Folgendes geschrieben:
Local a[200] 'initialize a[] to 200 elements
a=a[50..150] 'extract middle 100 elements of a[]
a=a[..50] 'extract first 50 elements of a[] <------- DAS
a=a[25..] 'extract elements starting from index 25 of a[]
a=a[..] 'copy all elements of a[]
a=a[..200] 'resize a[] to 200 elements <------ UND DAS


Wo ist da bitte sehr der unterschied?

Und hat das Teil nicht schon 200 Felder?

DamienX

BeitragDo, Dez 22, 2005 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow danke Jungs... das hilft mir ungemein!

Jetzt habe ich das größte Problem beseitigt...

EDIT: Aber wenn ich die Arrays jetzt fast schon wie Types behandeln
kann welche Existenzberechtigung habe dann noch diese?

@BtbN: Vieleicht besteht der Unterschied einfach dass das eine "resized"
wird und das andere schon angelegt ist!

Mfg DamienX

Jolinah

BeitragDo, Dez 22, 2005 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
BORNtobeNAMELESS hat Folgendes geschrieben:
oh, das wuste ich noch garnicht.
Aber:

BMax-Help hat Folgendes geschrieben:
Local a[200] 'initialize a[] to 200 elements
a=a[50..150] 'extract middle 100 elements of a[]
a=a[..50] 'extract first 50 elements of a[] <------- DAS
a=a[25..] 'extract elements starting from index 25 of a[]
a=a[..] 'copy all elements of a[]
a=a[..200] 'resize a[] to 200 elements <------ UND DAS


Wo ist da bitte sehr der unterschied?

Und hat das Teil nicht schon 200 Felder?


Code: [AUSKLAPPEN]
a=a[50..150] 'a hat danach nur noch 100 Felder
a = a[..50] 'von diesen 100 werden die ersten 50 genommen (a hat nun 50 Felder)
a=a[25..] 'von diesen 50 werden die 25 ab index 25 genommen (a hat 25 Felder)
a=a[..] 'kopie von a (immer noch 25 Felder)
a=a[..200] 'nun wirds wieder auf 200 Felder erweitert


Zitat:
EDIT: Aber wenn ich die Arrays jetzt fast schon wie Types behandeln kann welche Existenzberechtigung habe dann noch diese?


Ich finde, da ist ein ziemlich grosser Unterschied zwischen Types und Arrays Wink Und bei Types kommt die ganze OOP dazu (Vererben usw.).
  • Zuletzt bearbeitet von Jolinah am Do, Dez 22, 2005 12:22, insgesamt einmal bearbeitet

bruZard

BeitragDo, Dez 22, 2005 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
a=a[50..150] 'a hat danach nur noch 100 Felder
a = a[..50] 'von diesen 100 werden die ersten 50 genommen (a hat nun 50 Felder)
a=a[25..] 'von diesen 50 werden die 25 ab index 25 genommen (a hat 25 Felder)
a=a[..] 'kopie von a (immer noch 25 Felder)
a=a[..200] 'nun wirds wieder auf 200 Felder erweitert
[/quote]

Das funktioniert leider nicht mit mehrdimensionalen Arrays. Confused
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

BtbN

BeitragDo, Dez 22, 2005 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
kann man nicht einfach schreiben:

a=a[..200,..200]

?

Hummelpups

BeitragDo, Dez 22, 2005 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Werden die einträge beim vergrößern gelöscht?
Nein, die Ursprungswerte bleiben erhalten.
Aufgefüllt wird selbsverständlich mit 0.

Wenn ich schreibe:
a=a[..250]
wird a natürlich die neue größe zugewiesen und die werte von
0 - 250 gepickt und an a übergeben.





Machst du nun sowas hier:
Code: [AUSKLAPPEN]
local a[200]
a=a[..100]


Pickst du alle Werte von 0 - 99 heraus und speicherst
sie wieder in A, dadurch werden meiner Meinung die anderen
Bereiche nicht mehr referenziert und vom Garbage Collector vernichtet.
Deshalb funzt dieses Beispiel nicht:
Code: [AUSKLAPPEN]
Local a[200]
a=a[..100]

For steps=0 To 199
   a[steps]=1
Next


Wenn du aber das a[..100] in einer anderen Variable speichern
würdest.
Code: [AUSKLAPPEN]
Local a[200]
Local p[]


'A Füllen
For steps=0 To 199
   a[steps]=steps
Next

p=a[10..110]
p=p[..200]

For steps=0 To 199
   Print p[steps]
Next


Hast du zuerst den Array ohne größe. Dann liest du 100
Werte aus speicherst sie in p. p ist in diesem Fall ~100 Werte groß.
Wenn es dann wieder auf 200 skalierst, bleiben die alten
werte erhalten.

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
 

klepto2

BeitragDo, Dez 22, 2005 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon gesagt, kann man mehr dimensionale Arrays nicht vergrößern. Man kann sich aber helfen, indem man folgendes macht :
(Nennt sich Arrays in Arrays)

Code: [AUSKLAPPEN]

Local Test:Int[][]
Test = Test[..200]

For Local I = 0 To 199
   Test[I] = Test[I][..200]
Next


For Local x = 0 To 199
   For Local y  = 0 To 199
      Test[x][y] = Rand(0,200)
   Next
Next


'Resizing

Test = Test[..20]

For  I = 0 To 19
   Test[I] = Test[I][..20]
Next

For X = 0 To 19
   For  Y = 0 To 19
      Print "Array : " + x + " : " + y + " = " +Test[x][y]
   Next
Next


Näheres unter http://www.blitzwiki.org/index..._of_Arrays
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Hummelpups

BeitragFr, Dez 23, 2005 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
cool, danke
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

DamienX

BeitragSa, Dez 31, 2005 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
So einfach wie genial! Merci!

Mfg DamienX

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group