# Dynamische Array Deklaration



## Jai (30. August 2005)

Hi Leute,

wisst ihr vielleicht, wie man dynamische Array Deklaration in VB machen kann? Was ich damit meine ist, wenn ich im Programmkopf ein Array deklariere, dass ich die Anzahl der Arrayfelder nicht festlege.

Danke

Gruß Jai


----------



## Yoah (30. August 2005)

Das Zauberwort heißt Redimensionieren!


```
Dim array() As String 
Dim k As Ineteger 
Dim i As Ineteger 
k=0 

for i = 0 to 1000 
ReDim Preserve array(k) 
array(k) = "Hallo" 
k = k + 1 
next i
```


----------



## Jai (30. August 2005)

Danke sehr,

ich werde versuchen Deine Zauberformell in meinem Quellcode zu integrieren. 

Jai


----------



## Shakie (30. August 2005)

@Yoah: Du hast das etwas umständlich gemacht....eine Variable reicht für diese kleine For-Schleife auch aus:

```
Dim array() As String 
Dim i As Ineteger 
 
for i = 0 to 1000 
ReDim Preserve array(i) 
array(i) = "Hallo" 
next i
```
 
@Jai: Wenn du ein dynamisch erstelltes Array wieder löschen willst, dann kannst du das mit "Erase Arrayvariable" machen (nur so zur Info).


----------



## Yoah (30. August 2005)

stimmt, hatte den Quellcode aus nem Projekt von mir, brauchte da zwei.


----------



## Jai (30. August 2005)

Super, ihr 2 habt ja echt was drauf.

ich habe es ausprobiert und es funktioniert.

Aber was mache ich bei 2 und 3 Dimensionale Arrays, sowas wie array(4,10)

Ich habe 'logisch' so etwas vermutet:



Dim i(), H(), y() As String    ' Wobei y 2dimensional sein soll
Dim a,b As Integer

For a = 0 To 1000
        ReDim Preserve i(a), H(a)
        For b = 0 To 1000
                ReDim Preserve y(a, b)
        Next b
Next a




klappt aber nicht.

Fehlermeldung: Subscript out of range

Ich denke dass liegt an "Dim y() As String ", eigentlich sollte es ja auch sowas sein:
Dim y(,) As String [ja ich weiß, ihr lacht bestimmt über meine Gedankenweise  ] aber es funktioniert auch nicht. 

Wie lautet die "Zauberlösung" nun dafür?

Gruß Jai


----------



## Shakie (30. August 2005)

Du musst das Array nicht unbedingt in einer Schleifer vergrößern. Das war ja nur ein Beispiel.
Du kannst das ganze auch so machen:

```
Redim Preserve y(555)
```
 So wird das Array auf einen Schlag auf insgesamt 556 Einträge erweitert (Es sind 556 Einträge und nicht 555, weil es auch einen Nullten Eintrag gibt!)
Du kannst aber auch angeben, was die untere Grenze beim Array sein soll:

```
Redim Preserve y(3 to 555)
```
So wird ein Array erstellt, das bei 3 anfängt und bei 555 aufhört.
Wenn du ein zweidimensionales Array erstellen möchtest, dann machst du das so:

```
Redim Preserve y(500,500)
oder auch:
Redim Preserve y(3 to 555, 74 to 900)
```
 
Das "Preserve" steht übrigens nur da, damit Einträge, die bereits im Array drinnen sind, nicht verloren gehen. Wenn die Array-Einträge aber noch leer sind, dann kannst du das "Preserve" weglassen.


----------



## Jai (30. August 2005)

So, jetzt habe ich es verstanden: 
Mit ReDim erweitert man lediglich ein Array auf eine bestimmte und festgelegte Größe im Laufe des Programms.

Aber auf diese Idee ein 'unendlich' großes Array(wie z.B y(500)) zu deklarieren war ich schon gekommen, aber ich dachte es nimmt zu viel Speicherplatz unnötig in Anspruch, wenn man nachher nur 100 Felder Tatsächlich belegt. Das war ursprünglich meine Frage, ob es möglich ist, dass die Obergrenze zunächst offen ist aber nachher genau so viele Felder zur Verfügung gestellt werden wie nötig (und etwa nicht 100 Stück mehr).

Danke für Deinen Beitrag.

Jai


----------



## Shakie (31. August 2005)

Klar ist es möglich, das Array im Laufe des Programms immer zu vergrößern. So war ja auch das erste Beispiel von Yoah gemeint (oder nicht?). Darin wird eine Schleife 1000 mal durchlaufen, wobei das Array jedesmal um einen Eintrag vergrößert wird.
Du fängst beispielsweise mit einem Array an, das nur einen Eintrag hat:

```
Redim DeinArray(1 to 1)
```
 
Dann kannst du das Array bei bedarf vergrößern, hier ist das "Preserve" ganz nützlich:

```
Redim Preserve DeinArray(1 to 2)
```
 
Noch eine nützliche Information:
Wenn du herausfinden willst, wie groß dein Array bereits ist, dann kannst du das mit LBound und UBound herausfinden:
Mit "LBound(DeinArray)" kannst du die untere Grenze des Arrays ermitteln, in dem Beispiel von eben grad wäre das 1.
Mit "UBound(DeinArray)" kannst du die obere Grenze des Arrays ermitteln, in dem Beispiel von eben grad wäre das dann 2.

Nun kannst du beispielsweise folgenden Code verwenden, um dein Array um einen Eintrag zu vergrößern, ohne dass du dir merken musst wie groß dein Array bereits ist:

```
ReDim Preserve DeinArray(LBound(DeinArray) To UBound(DeinArray) + 1)
```
 
Ich hoffe dir wird das mit den Arrays nun ein bisschen klarer.


----------

