Gambas: Arrays

Aus Wikibooks
Wechseln zu: Navigation, Suche


Zurück zu Gambas


Einfache Arrays[Bearbeiten]

Siehe auch: http://www.madeasy.de/7/prgmini.htm#arr

Arrays sind Listen oder Tabellen, in die man zusammengehörige Texte oder Werte vom selben Dateityp abspeichert. Jedes Element des Arrays ist einzeln ansprechbar.

Beispiel eines Arrays: Liste von 5 Vornamen

  • Anna
  • Anton
  • Toni
  • Max
  • Klaus

Um Arrays zu definieren, reicht kein einfaches Ist-Gleich-Zeichen, sondern man braucht eine besondere Deklaration: Um eine Namensliste , wie die obige, in Gambas zu bekommen, nimmt man am besten einen Stringarray (Textarray):

Beispiel:


PUBLIC SUB Form_Open()
a AS String[]
x AS Integer
a = NEW String[]
FOR x = 0 TO 4
    a.Add(Str(x))
NEXT
 a[0] = "Anna"
 a[1] = "Anton"
 a[2] = "Toni"
 a[3] = "Max"
 a[4] = "Klaus"
FOR x = 0 TO 4
   PRINT a[x]
 NEXT
END

Um dieses Beispielprogramm in Gang zu bringen brauchen Sie nur eine leere Form. Das Programm gliedert sich in 4 Teile:

  • 1. Ein Stringarray wird deklariert.
a AS String[]
  • 2.Der Stringarry wird initialisiert.
DIM x AS Integer
a = NEW String[]
FOR x = 0 TO 4
    a.Add(Str(x))
NEXT
  • 3.Der Stringarray wird mit echten Elementen gefüllt:
 a[0] = "Anna"
 a[1] = "Anton"
 a[2] = "Toni"
 a[3] = "Max"
 a[4] = "Klaus"
  • 4.Um zu Überprüfen, ob die Elemente wirklich im Array gespeichert wurden, werden sie dann wieder mit einer Schleife und dem Printbefehl im Direktfenster ausgegeben.
FOR x = 0 TO 4
   PRINT a[x]
NEXT

Das erscheint reichlich kompliziert oder was meinen Sie ? Es geht auch etwas einfacher, wenn man den Array Befehl nutzt. Dies ist im nächsten Kapitel beschrieben.

Erstaunlicherweise funktioniert das obige Programm nur im Grafikmodus. Aber vielleicht fehlt mir auch nur ein Trick um es im Terminalmodus zu ermöglichen. Außerdem ist die Deklaration ziemlich umständlich. a = NEW String[5] funktioniert nicht.

Man kann die einzelnen Elemente über ihre Position im Array ansprechen, wobei das erste Element die Position 0 hat:

Benennung der Einträge

 a[0] = "Anna"
 a[1] = "Anton"
 a[2] = "Toni"
 a[3] = "Max"
 a[4] = "Klaus"

Um den Namen Max ausgeben zu lassen, muß man dann schreiben:

print a[3]

Beachten Sie bitte das a kein Element von Gambas ist , sondern oben im Beispielprogramm als Array definiert wurde.

Die eckigen Klammern sind hier nicht wie üblich bei Computertexten optionale Angaben, sondern man muß bei Arrays wirklich eckige Klammern verwenden.

Der Index eines Arrays beginnt immer bei 0, somit ergeben sich die gültigen Indizes bei einem Array der Größe n: 0, 1, 2, ..., n-1.

Der Umgang mit Arrays ist für Anfänger sehr gewöhnungsbedürftig. Trotzdem lohnt es sich, sich mit den verschiedenen Arten und Programmiermöglichkeiten von Arrays vertraut zu machen, denn sie machen die Programme übersichtlicher und kürzer. Insbesondere bei der Programmierung von Datenbanken oder Tabellen sind Arrays unverzichtbar.

Neben dem hier gezeigten Stringarray kann man auch für jeden anderen Dateityp ein Array definieren. Es gibt also Binärarrays, Textarrays, Ganzzahlenarrays, Arrays für Fließkommazahlen etc etc. Sogar für zusammengesetzte Dateitypen wie zb Objekte kann man Arrays verwenden.

Die Elemente eines Arrays haben dabei alle denselben Dateityp. Will man auch noch den Dateityp in der Liste variieren, dann muß man statt eines Arrays eine Collection heranziehen.

Schneller füllen mit dem Arraybefehl[Bearbeiten]

Der Arraybefehl verkürzt das obige Programm enorm. Mit ihm kann man ein Array viel schneller füllen.

Wie das geht zeigt folgendes Beispiel. Sie brauchen nur eine leere Form um es in Gang zu bringen:

PUBLIC SUB Form_Open()
x AS Integer
a AS String[]
a = Array("Anna","Anton","Toni","Max","Klaus")
FOR x = 0 TO 4
   print a[x] 
   'Ausgabe des Arrays im Direktfenster
NEXT
END

Wollen Sie die Ausgabe nicht in das Direktfenster umleiten, dann fügen Sie Ihrer Form eine Textarea hinzu und ändern den Code folgendermassen:

PUBLIC SUB Form_Open()
x AS Integer
a AS String[]
a = Array("Anna","Anton","Toni","Max","Klaus")
Textarea1.Text = ""
 FOR x = 0 TO 4
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT
END

Das Zeichen chr(10) fügt einen Zeilenwechsel zwischen die Namen. Mit Textarea1.Text = "" wird die Textarea am Start gelöscht.

Einfache Arrayroutinen[Bearbeiten]

Erzeugung[Bearbeiten]

Es soll ein Integer Array mit 20 Elementen erzeugt werden. Dazu nutzen sie folgende Zeile:

feld [20] AS Integer 

Etwas umständlicher geht das auch so:

feld AS NEW Integer[]
i AS Integer 
 FOR i = 0 TO 19
   feld.Add(i)
 NEXT

Zu beachten ist jedoch, das jeder Array mit [0] beginnt. So ist das letzte Element feld[19] (0 bis 19 = 20 Elemente). Laut der Deklaration feld [20] AS Integer wäre zu vermuten, das auch das Element feld[20] einen Wert hat. Das stimmt aber nicht, es liegt bereits außerhalb der Deklaration (out of Bound).

Operationen mit Elementen[Bearbeiten]

Mit Arrayelementen können alle Operationen wie gewohnt ausgeführt werden. Beispiel:

feld[2] = 77
feld[3] = feld[2] - 7

Die erste Zeile weist dem 3. (dritten!) Element des Arrays die Zahl 77 zu. Die zweite Zeile weist dem 4. (vierten!) Element des Arrays die Zahl 77 - 7 = 70 zu.

Index[Bearbeiten]

Als Index kann eine Variable oder Konstante angegeben werden:

n as integer 
n = 1
feld[n] = 25

Dieser Code weist dem n-ten Element (dem 2.) den Wert 25 zu.

Als Programm:

PUBLIC SUB Form_Open()
feld[4] AS Integer
n AS Integer 
feld[2] = 77
feld[3] = feld[2] - 7
n = 1
feld[n] = 25
FOR n = 0 TO 3
   PRINT feld[n]
NEXT
END

Ausgabe im Direktfenster:

 0
25
77
70      

Wenn Sie print feld[4] eingeben, erscheint die Fehlermeldung: Out of bounds

Probieren sie noch einmal folgende Variante, dann wird es vielleicht klarer:

PUBLIC SUB Form_Open()
feld[4] AS Integer
'Deklariert das Zahlenarry feld[0 bis 3] !!!
n AS Integer 
feld[2] = 77
feld[3] = feld[2] - 7
n = 1
feld[n] = 25
FOR n = 0 TO 3
   PRINT "feld[" & n & "] = " & feld[n]
NEXT
'PRINT feld[4] ergibt einen Fehler !!!
END

Mehrere Dimensionen[Bearbeiten]

Weiterhin können Arrays mit mehr als einer Dimension erzeugt werden.

schachbrett[10, 10] AS Integer 

Erzeugt ein 2-Dimensionales Integer-Feld der Größe 10 x 10.

Als Programmbeispiel:

PUBLIC SUB Form_Open()
  i AS Integer
  n AS Integer
  schachbrett[10, 10] AS Integer 
   FOR i = 0 TO 9
    FOR n = 0 TO 9
      PRINT i, n
      schachbrett[i, n] = i*10 + n 
      PRINT schachbrett[i, n]
     NEXT
    NEXT
END

Fehler mit Arrays[Bearbeiten]

Beispiel 2:

In diesem Beispiel wird ein Stringarray definiert und am Anfang mit fortlaufenden Zahlen gefüllt. Dabei entspricht die jeweilige Zahl der Position im Array. Bei der zweiten Füllung des Arrays ist das nicht mehr der Fall. Jetzt ist das Array mit Quadratzahlen gefüllt worden.

Um das Programm in Gang zu bringen , brauchen Sie 2 Befehlsbuttons und ein Textlabelfeld.

ar AS String[]
'Der array wir als String definiert
PUBLIC SUB Button1_Click()
' Der Array wird ausgegeben
 i AS Integer
 txt AS String
 ar = NEW String[]
 FOR i = 0 TO 3
   ar.Add(Str(i))
 NEXT
 FOR i = 0 TO 3
   txt = txt & ar[i]
 NEXT
 TextLabel1.Text = txt
END
PUBLIC SUB Button2_Click()
'Der array wird neu gefüllt 
a AS Integer
i AS Integer
txt AS String
ar = NEW String[]
FOR a = 0 TO 3 
   ar.Add(Str(a*a))
NEXT
FOR i = 0 TO 3
  txt = txt & ar[i]
NEXT
 TextLabel1.Text = txt
END

Auch diese Programm können Sie mit dem Arraybefehl verkürzen:

ar AS Integer[]
'Der array wir als Zahlenliste definiert
PUBLIC SUB Button1_Click()
'Der Array wird gefüllt und ausgegeben
 i AS Integer
 txt AS String
 ar = Array(0,1,2,3)
 FOR i = 0 TO 3
   txt = txt & ar[i]
 NEXT
 TextLabel1.Text = txt
END
PUBLIC SUB Button2_Click()
'Der array wird mit den Quadratzahlen der ersten Füllung erneut gefüllt 
 a AS Integer
 i AS Integer
 txt AS String
 ar = Array(ar[0]^2,ar[1]^2,ar[2]^2,ar[3]^2)
 FOR i = 0 TO 3
   txt = txt & ar[i]
 NEXT
 TextLabel1.Text = txt
END

Vorsicht! Diese Programm funktioniert nur einmal richtig. Beim zweiten Programmlauf erfolgt eine Fehlermeldung.

Type mismatch: Wanted Integer[], got float[] instead.

Die Schachtelung des Arrays ist also fehlerträchtig:

  ar = Array(ar[0]^2,ar[1]^2,ar[2]^2,ar[3]^2)


Als Übung können Sie ein Array aller kleinen Buchstaben des Alphabets aufstellen:


Beispiel 3: Ein 3-dimensionales Array

Um das Programm in Gang zu bringen brauchen Sie eine Form und einen Befehlsbutton.

PUBLIC SUB Button1_Click()
  DIM i AS Integer
  DIM ii AS Integer
  DIM iii AS Integer
  DIM Matrix[3, 3, 3] AS Integer 
   FOR i = 0 TO 2
    FOR ii = 0 TO 2
     FOR iii = 0 TO 2
      PRINT i, ii , iii
      Matrix[i, ii, iii] = i*9 + ii*3 + iii
      PRINT Matrix[i, ii, iii]
     NEXT
    NEXT
   NEXT
END

Split >> Zerlegt einen Text in ein Stringarray mit lauter einzelnen Elementen[Bearbeiten]

Der Befehl Split zerlegt einen Textstring in kleine Textteile, die durch ein bestimmtes Trennzeichen abgegrenzt sind.

Die Syntax des Befehls lautet:

Array = Split ( Text [ , Trennzeichen , Nichttrennen ] ) 

Benutzt man den Befehl ganz einfach nur mit der Angabe für Text, dann wird als Trennzeichen das Komma verwendet.

Array = Split(Text) 

Will man einen Satz beispielsweise in seine Wörter trennen, dann benutzt man folgende Variante:

Array = Split(Satz," ")

Wenn man mehrere verschiedene Trennzeichen verwenden will ( zb Komma und Punkt) dann muss man diese als zweiten Parameter übergeben zusammengefügt zu einem einzigen String.

Will man bestimmte Bereiche nicht trennen , dann kann man ein Nichttrennenzeichen angeben. Alles was zwischen zwei Nichttrennenzeichen steht ( zb in Anführungsstrichen ) wird nicht zerlegt.

Für das Nichttrennenzeichen gibt es keine Voreinstellung. Man muß es immer explizit eingeben.

Die Splitfunktion liefert einen Stringarray ( = eine Wörterliste) zurück, der jeweils mit den einzelnen zerlegten Elementen gefüllt wurde.

Beispiel: Sie brauchen einen Befehlsknopf, um das Beispiel in Gang zu bringen.

PUBLIC SUB Button1_Click()
e AS String[]
s AS String
 e = Split("Gambas Almost Means BASIC !", " ")
 FOR EACH s IN e
   PRINT s
 NEXT
End

Ausgabe:

Gambas
Almost
Means
BASIC
!

Versuchen Sie einmal dasselbe Programm mit dem Trennzeichen a. Als Ausgabe erhalten Sie dann:

G mb s Almost Me ns BASIC !

Das Trennzeichen wird also nicht in die Elemente des Arrays mit aufgenommen.

Der Splitbefehl ist sehr praktisch und kann in einer Vielzahl von Programmen gut verwendet werden. Beispiel finden sich in Gambas: Statistik

Join Der Befehl zum zusammenfügen[Bearbeiten]

Der Befehl klebt eine Liste wieder zusammen. Er ist das Gegenteil des Splitbefehls.


For each[Bearbeiten]

Mit For each werden alle Einträge eines Arrays einer anderen Variable zugewiesen, die man dann ausgeben kann.

Beispiel: Sehr beliebt ist Addy der Summierer. Auch er nutzt einen Stringarray.

Sie brauchen eine Textarea, eine Textbox und einen Commandbutton um das Programm zu starten.

PUBLIC SUB Button1_Click()
DIM text AS String
DIM summe AS Float
DIM liste AS String[]
DIM posten AS String
text = textarea1.Text
liste = Split(text,Chr(10))
FOR EACH posten IN liste
 summe = summe + Val(posten)
NEXT
textbox1.Text = summe
END

Geben Sie in die Textarea ein paar Zahlen und dazwischen Return ein. Dann drücken Sie auf die Befehlstaste. Die Zahlen werden zusammengezählt. Die Liste in der Textarea kann beliebig korrigiert werden. Auch negative Zahlen werden verarbeitet.

Vorsicht: Geben Sie keine Buchstaben oder Sonderzeichen ein. So robust ist Addy noch nicht.

Arrayroutinen Add,Remove,Resize,Revert,Clear, Sort[Bearbeiten]

Gambas bringt für alle seine Arrayarten eine Reihe von sehr nützlichen Routinen mit.

Arrayroutinen[Bearbeiten]

  • Add
    • ein Element am Ende hinzufügen oder an einer Position einfügen
  • Remove
    • ein Element am Ende wegnehmen oder an einer definierten Position wegnehmen
  • Revert
    • Reihenfolge umdrehen
  • Resize
    • Dem Array eine neue Größe geben
  • Clear
    • Alle Elemente weglöschen
  • Sort
    • In aufsteigender oder absteigender Reihenfolge sortieren

Wie die Arrayroutinen funktionieren, zeigt das folgende Programm.

Sie brauchen[Bearbeiten]

  • 11 Buttons
  • 4 Textboxen
  • 1 Textarea

um das Programm in Gang zu bringen.

Layout[Bearbeiten]

Gambasarrayroutinen.png

Code[Bearbeiten]

PUBLIC a AS String[]
PUBLIC SUB Form_Open()
x AS Integer
a = Array("Anna","Anton","Toni","Max","Klaus")
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT
Textbox1.Text = "Franz"
Button1.Text = "Hinzufügen"
Button2.Text = "Einfügen"
Textbox2.Text = "2"
Textbox3.Text = "2"
Textbox4.Text = "3"
ME.Text = "Arraybefehle"
END
PUBLIC SUB Button1_Click()
x AS Integer 
a.Add(Textbox1.Text)
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
 'Die Länge des Array wird von 1 an gezählt, die Position von 0 an
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT
END
PUBLIC SUB Button2_Click()
x AS Integer 
a.Add(Textbox1.Text,Val(Textbox2.Text))
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT
END
PUBLIC SUB Button3_Click()
x AS Integer
 a.Sort(0)
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
NEXT 
END
PUBLIC SUB Button4_Click()
x AS Integer
 a.Sort(16)
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT 
END
PUBLIC SUB Button5_Click()
x AS Integer
 a.clear
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT 
END
PUBLIC SUB Button6_Click()
x AS Integer
 a.resize(8)
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT 
END
PUBLIC SUB Button7_Click()
x AS Integer
 a.reverse
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT 
END
PUBLIC SUB Button8_Click()
x AS Integer
 a.remove(Val(textbox3.text),Val(textbox4.text))
Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT 
END
PUBLIC SUB Button9_Click()
   ME.Close 
END
PUBLIC SUB Button10_Click()
 x AS Integer
 a = Array("Anna","Anton","Toni","Max","Klaus")
 Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT
END
PUBLIC SUB Button11_Click()
text AS String
posten AS String 
text = textarea1.Text
a = Split(text,Chr(10))
FOR EACH posten IN a
NEXT
END

Man kann dieses Programm vereinfachen, wenn man die Arrayausgabe in der Textarea in eine Subroutine packt, denn sie kommt immer wieder vor.

 x as integer 
 Textarea1.Text = ""
 FOR x = 0 TO (a.Length - 1)
   Textarea1.Text = Textarea1.Text & a[x] & Chr(10)
 NEXT

Übrigens: Für das Array Object[] funktiert das Sortieren noch nicht.

Array mit Zufallszahlen füllen[Bearbeiten]

Man kann ein Array auch mit Zufallszahlen füllen , um beispielsweise Algorithmen zum Sortieren zu testen.

Wie das geht zeigt folgendes Miniprogramm. Sie brauchen dazu eine Form und einen Befehlsbutton. Das Array wird bereits beim Laden der Form erzeugt und gefüllt. Drückt man auf den Befehlsknopf, wird das Array im Direktfenster ausgegeben.

Es werden 6 Zufallszahlen zwischen 1 und 10 erzeugt und in den Array eingelesen.

Einige Ungereimtheiten ergeben sich hier noch bei der Benennung der Arrays ( siehe Programmkommentare) Außerdem erkennt man jetzt auch den Vorteil, daß es 2 Methoden der Array Füllung gibt.

' Gambas class file
ar AS Float[]
'warum gibt es eine Fehlermeldung , 
'wenn man das Array mit Integer[] festlegt.
PUBLIC SUB Form_Open()
 Randomize()
 ar = Array(Int(Rnd(1,10)) , Int(Rnd(1,10)) , Int(Rnd(1,10)) , Int(Rnd(1,10)) , Int(Rnd(1,10)) , Int(Rnd(1,10)))
END
PUBLIC SUB Button1_Click()
element AS Integer 
 FOR EACH element IN ar 
    PRINT element
 NEXT
END

Alternative:

ar AS Integer[]
'Obwohl der Array als Integerarray definiert ist, 
'funktioniert er weiter unten als Stringarray Wieso ?
PUBLIC SUB Form_Open()
x AS Integer
ar = NEW Integer[]
FOR x = 0 TO 10
  ar.Add(Str(x))
NEXT
END
PUBLIC SUB Button1_Click()
x AS Integer 
Randomize()
FOR x = 0 TO 10
  ar[x] = Int(Rnd(1,10))
NEXT 
END
PUBLIC SUB Button2_Click()
element AS Integer 
  FOR EACH element IN ar 
     PRINT element;
  NEXT
  PRINT
END

Wieviel Elemente hat der Array ? Warum so viele ? Probieren Sie das Programm einmal ohne den Randomize Befehl, dann erkennen Sie seine Notwendigkeit.

Lottozahlen ( 7 aus 49 )[Bearbeiten]

Das folgende Programm erzeugt sieben Lottozahlen , wirft Doppelgänger heraus und gibt die Zahlen sortiert aus: Genutzt wird dabei ein Array mit 49 Elementen.

Zunächst wird das Programm in seine Einzelteile zerlegt und auf 4 Comanndbuttons gelegt.

  • Commandbutton1 >> Array mit 7 Zufallszahlen
  • Commandbutton2 >> Kompletten Array über Print ausgeben
  • Commandbutton3 >> Nur die Elemente ausgeben, die ungleich Null sind
  • Commandbutton4 >> Kompletten Array wieder mit Nullen füllen.
ar AS Integer[]
PUBLIC SUB Form_Open()
'schon beim Öffnen der Form wird der Array mit lauter Nullen gefüllt.
x AS Integer
ar = NEW Integer[]
FOR x = 0 TO 48
  ar.Add(Str(0))
NEXT
END
PUBLIC SUB Button1_Click()
'dann wird der Array mit 7 Zufallszahlen an den Stellen gefüllt, die mit der Zufallszahl übereinstimmen 
x AS Integer 
r AS Integer  
Randomize() 
FOR x = 0 TO 6
  r = Int(Rnd(1,49))
  IF r = ar[r] THEN x = x - 1 
  'Falls ein Doppelgänger auftritt gehe eins zurück 
  ar[r] = r
NEXT 
END
PUBLIC SUB Button2_Click()
'zu Testzwecken wird das ganze Array ausgegeben 
element AS Integer 
  FOR EACH element IN ar 
     PRINT element
  NEXT
END
PUBLIC SUB Button3_Click()
'jetzt werden nur noch die Elemente ausgegeben , die ungleich 0 sind 
element AS Integer 
  FOR EACH element IN ar 
     IF element <> 0 THEN PRINT element
  NEXT
END
PUBLIC SUB Button4_Click()
'der Array wird wieder komplett auf Null gestellt
x AS Integer 
FOR x = 0 TO 48
  ar[x] = 0 
NEXT
END

Nachdem man das Programm in einzelne Schritte zerlegt hat, kann man es jetzt auf einen einzigen Button zusammenfassen. Und die Zusatzzahl fehlt natürlich noch.

' Gambas class file Lottozahlen 
ar AS Integer[]
PUBLIC SUB Form_Open()
'schon beim Öffnen der Form wird der Array mit lauter Nullen gefüllt.
x AS Integer
ar = NEW Integer[]
FOR x = 0 TO 48
 ar.Add(Str(0))
NEXT
END
PUBLIC SUB Button1_Click()
x AS Integer 
r AS Integer  
element AS Integer 
'der Array wird komplett auf Null gestellt
FOR x = 0 TO 48
 ar[x] = 0 
NEXT
'dann wird der Array mit 7 Zufallszahlen an den Stellen gefüllt, die mit der Zufallszahl übereinstimmen 
Randomize() 
FOR x = 0 TO 6
 r = Int(Rnd(1,49))
 IF r = ar[r] THEN x = x - 1 
 'Falls ein Doppelgänger auftritt gehe eins zurück 
 ar[r] = r
NEXT 
'nur die Zahlen <> 0 werden ausgegeben
FOR EACH element IN ar 
   IF element <> 0 THEN PRINT element
NEXT
END

Überlegen Sie einmal warum die Elemente des Arrays zweimal auf Null gestellt wurden. Wenn Sie es nicht wissen, dann werfen Sie doch die eine Schleife heraus und probieren Sie das Programm ein paar Mal aus. Dann erkennen Sie die Notwendigkeit, wenn man mehrfach den Befhelsbutton drückt.

Doppelgänger aus dem Array herauswerfen[Bearbeiten]

Hierfür wir ein temporäres Array erstellt und die Elemente kopiert die im neuen temporären Array noch nicht vorhanden sind.

Beispiel als Funktion:

PUBLIC FUNCTION RemoveDuplicates(sArray AS String[]) AS String[]
  DIM s AS String
  DIM tempArray AS NEW String[]
  FOR EACH s IN sArray
     IF tempArray.Find(s) = -1 THEN tempArray.Add(s)
  NEXT
  RETURN tempArray
END

Aufruf mit:

...
RemoveDuplicates(Array)
...

Theorie[Bearbeiten]

.Array Diese virtuelle Klasse ist die Eltern Klasse jedes anderen Gambas arrays.

Diese Klasse ist virtuell. Man kann sie nicht als Datentyp benutzen. Sie ist nicht erzeugbar (creatable. ).

Eigenschaften:

  • Count (identisch mit Length)
  • Length

Methoden

  • Add
  • Clear
  • Remove
  • Resize
  • Reverse
  • Sort

Arten von Arrays[Bearbeiten]

Arrays sind in Gambas meist an den eckigen Klammern zu erkennen: []

Mit der Schnellmethode über den Arraybefehl können Sie aber auch mit runden Klammern () definiert werden.

Wenn Sie nicht wissen, was für eine Art von Array sie definiert haben, dann lassen Sie sich die Art des Arrays im Direktfenster ausgeben. Wenn man sein Array mit dem Arraybefehl gefüllt hat, dann wird der Typ des Arrays durch das erste Element definiert. Die anderen Elemente werden automatisch zum selben Typ umgewandelt.

Mit Join kann man die Elemente des Arrays bei der Ausgabe trennen

Beispiel:

PUBLIC SUB Form_Open()
ar AS Integer[]
ar = Array(3,3,3)
PRINT Object.Type(ar)
END

Ausgabe: Integer[]

PRINT Object.Type(Array("2.4", 3, 3.2))

Ausgabe: String[]

PRINT [ "A", "B", "C" ].Join("/")

Ausgabe A/B/C

Zweidimensionales Array anlegen[Bearbeiten]

Siehe Gambas: Tabelle

Array Routinen[Bearbeiten]

  • Zweidimensionale Felder anlegen
  • Ein Boolean-Array
  • Anzahl der Dimensionen eines Arrays bestimmen
  • Arrays dynamisch vergrößern
  • FAQ - Oft gestellte Fragen über Arrays
  • Element in Array suchen
  • Schnelles Einfügen und Löschen
  • Arrayinhalte schnell mischen
  • Schnelle Sortierung mit QuickSort und MinSort


Stoffsammlung und Fragen zu Arrays[Bearbeiten]

Will man die einzelnen Einträge durch ein Zeichen trennen, geht das normalerweise mit der Join Methode.

Hinzufügen von Einträgen

Wie kann man Einträge in ein Array hinzufügen ?

Zählen der Einträge

Wie erfolgt das Zählen der Einträge ? ( Length Eigenschaft )

PRINT a.Count

Einträge durchsuchen

Wenn man ein Array nach einem Eintrag durchsuchen will, geht das so:

Array.Find(SuchWert)

Sortieren der Einträge

Wie kann man Arrays sortieren ?

Array.Sort

Wie kann man nach den Namen der Werte sortieren lassen ? Wie kann man die Elemente in Ihrer Reihenfolge umdrehen ?

Array.Reverse