Arrays (matrices)

From Apache OpenOffice Wiki
Jump to: navigation, search
Book.png


In aanvulling op eenvoudige variabelen (scalairen), ondersteunt Apache OpenOffice BASIC ook matrices (arrays/gegevensvelden). Een gegevensveld bevat verschillende variabelen, welke worden benaderd door middel van een index.

Definiëren van arrays

Arrays kunnen als volgt worden gedefinieerd:

Eenvoudige arrays

Een declaratie voor een array komt overeen met die van een declaratie voor een eenvoudige variabele. Echter, anders dan bij de variabele declaratie, wordt de naam van de array gevolgd door haken die de specificaties bevatten voor het aantal elementen. De expressie

Dim MyArray(3)

declareert een array die vier variabelen heeft van het gegevenstype Variant, namelijk MyArray(0), MyArray(1), MyArray(2) en MyArray(3).

U kunt ook type-specifieke variabelen declareren in een array. De volgende regel declareert, bijvoorbeeld, een array met vier Integer-variabelen:

Dim MyInteger(3) As Integer

In het voorgaande voorbeeld begint de index voor de array altijd met de standaard startwaarde van nul. Als alternatief kan een geldigheidsbereik met start- en eindwaarden worden gespecificeerd voor de declaratie van het gegevensveld. Het volgende voorbeeld declareert een gegevensveld dat zes Integer-waarden heeft en kan worden benaderd met behulp van de indexnummers 5 tot en met 10:

Dim MyInteger(5 To 10) As Integer

De indexnummers behoeven geen positieve waarden te zijn. Het volgende voorbeeld toont ook een juiste declaratie, maar met negatieve grenzen voor het gegevensveld:

Dim MyInteger(-10 To -5) As Integer

Het declareert een integer gegevensveld met 6 waarden die kunnen worden benaderd met behulp van de indexnummers -10 tot en met -5.

Er zijn geen praktische grenzen aan de indexen of aan het aantal elementen in een array, zo lang als er voldoende geheugen is:

Dim s(-53000 to 89000) As String
s(-52000) = "aa"
s(79999) = "bb"
print s(-52000), s(79999)
Documentation note.png VBA : Andere grenzen voor waarden zijn soms van toepassing op indexen voor gegevensvelden in VBA. Hetzelfde is ook van toepassing op het maximale aantal mogelijk elementen per dimensie. De geldige waarden daarvoor kunnen worden gevonden in de relevante documentatie voor VBA.


Gespecificeerde waarde voor begin van index

Het begin van de index van een gegevensveld begint normaal gesproken met de waarde 0. Als alternatief kunt u het begin van de index voor alle declaraties voor gegevensvelden veranderen naar de waarde 1 met behulp van de aanroep:

Option Base 1

De aanroep moet worden opgenomen in de kop van een module als u wilt dat het van toepassing is op alle declaraties voor gegevensvelden in de module. Echter, deze aanroep beïnvloedt niet de UNO-reeksen die werden gedefinieerd door middel van de Apache OpenOffice API waarvan de index altijd begint met 0. Om duidelijkheid te waarborgen, zou u gebruik van Option Base 1 moeten vermijden. Het aantal elementen in een bereik wordt niet beïnvloedt als u Option Base 1 gebruikt, alleen het begin van de index verandert. De declaratie

Option Base 1
' ...
Dim MyInteger(3)

creëert 4 integer-variabelen die kunnen worden beschreven met de expressies MyInteger(1), MyInteger(2), MyInteger(3) en MyInteger(4).

Documentation note.png VBA : In Apache OpenOffice BASIC beïnvloedt de expressie Option Base 1 niet het aantal elementen in een array zoals het dat doet in VBA. Het is, eigenlijk, het begin van de index die in Apache OpenOffice BASIC wordt verplaatst. Waar de declaratie MyInteger(3) in VBA drie Integer-waarden creëert met de indexen 1 tot en met 3, creëert dezelfde declaratie in Apache OpenOffice BASIC vier Integer-waarden met de indexen 1 tot en met 4. Door Option Compatible te gebruiken gedraagt Apache OpenOffice BASIC zich als VBA.


Multidimensionale gegevensvelden

In aanvulling op enkele dimensionale gegevensvelden, ondersteunt Apache OpenOffice BASIC ook het werken met multidimensionale gegevensvelden. De corresponderende dimensies worden van elkaar gescheiden door komma's. Het voorbeeld

Dim MyIntArray(5, 5) As Integer

definieert een integer bereik met twee dimensies, elk met 6 indexnummers (kunnen worden benaderd met de indexnummers 0 tot en met 5). De gehele array kan in totaal 6 × 6 = 36 Integer-waarden opnemen.

U kunt honderden dimensies definiëren in Apache OpenOffice BASIC arrays, de beschikbare hoeveelheid geheugen beperkt echter het aantal dimensies dat u kunt hebben.

Dynamische veranderingen in de dimensies van gegevensvelden

De voorgaande voorbeelden zijn gebaseerd op gegevensvelden in een gespecificeerde dimensie. U kunt ook arrays definiëren waarbij de dimensie van de gegevensvelden dynamisch verandert. Bijvoorbeeld: u kunt een array definiëren om alle woorden in een tekst, die beginnen met de letter A, te bevatten. Als het aantal woorden bij aanvang onbekend is, moet u in staat zijn om de veldbegrenzingen overeenkomstig aan te passen. Gebruik, om dit in Apache OpenOffice BASIC te doen, de volgende aanroep:

ReDim MyArray(10)
Documentation note.png VBA : Anders dan in VBA, waar u u alleen dynamische arrays kunt dimensioneren met behulp van Dim MyArray(), laat Apache OpenOffice BASIC u zowel statische als dynamische arrays wijzigen met behulp van ReDim.


Het volgende voorbeeld wijzigt de dimensie van de initiële array zodat het 11 of 21 waarden kan opnemen:

Dim MyArray(4) As Integer ' Declaratie met vijf elementen 
' ...
ReDim MyArray(10) As Integer ' Verhogen tot to 11 elementen
' ... 
ReDim MyArray(20) As Integer ' Verhogen tot 21 elementen

Als u de dimensies van een array opnieuw instelt, kunt u elk van de opties, weergegeven in de voorgaande gedeelten, gebruiken. Dit is inclusief het declareren van multidimensionale gegevensvelden en specificeren van expliciete begin- en eindwaarden. Als de dimensies van het gegevensveld worden veranderd, gaat alle inhoud verloren. Als u de oorspronkelijke waarden wilt behouden, gebruik dan de opdracht Preserve:

Dim MyArray(10) As Integer ' Definiëren van de initiële 
' dimensies
' ... 
ReDim Preserve MyArray(20) As Integer ' Verhogen in 
' gegevensveld, terwijl
' de inhoud wordt behouden

Als u Preserve gebruikt, zorg er dan voor dat het aantal dimensies en het type van variabelen hetzelfde blijven.

Documentation note.png VBA : Anders dan in VBA, waar alleen de bovengrens van de laatste dimensie van een gegevensveld kan worden gewijzigd door Preserve, laat Apache OpenOffice BASIC u ook andere dimensies wijzigen.


Als u ReDim gebruikt met Preserve, moet u hetzelfde gegevenstype gebruiken als welke is gespecificeerd in de originele declaratie van het gegevensveld.

Bepalen van de dimensies van gegevensvelden

De functies LBound() en UBound() geven respectievelijk de laagste toegestane waarde van de index en de hoogste toegestane waarde van de index van een array terug. Dit is handig als een array zijn dimensies heeft gewijzigd.

Dim MyArray(10) As Integer
' ... enkele instructies
Dim n As Integer
n = 47 ' zou het resultaat van een berekening kunnen zijn
Redim MyArray(n) As Integer
MsgBox(LBound(MyArray))  ' geeft weer : 0  
MsgBox(UBound(MyArray))  ' geeft weer : 47

Voor een multidimensionale array dient u de positie (1 tot en met n) te specificeren van de index waarvan u de toegestane onderste en bovenste waarde wilt weten:

Dim MyArray(10, 13 to 28) As Integer
MsgBox(LBound(MyArray, 2))  ' geeft weer : 13
MsgBox(UBound(MyArray, 2))  ' geeft weer : 28

Lege arrays

In sommige gevallen, speciaal wanneer met de API wordt gewerkt, moet u een lege array declareren. Een dergelijke array wordt gedeclareerd zonder dimensie, maar kan later worden gevuld door een API-functie of met een argument Redim:

Dim s() As String ' declareer een lege array
' --- later in het programma ...
Redim s(13) As String

U kunt geen waarde toewijzen aan een lege array, omdat het geen elementen bevat.

De "handtekening" van een lege array is dat UBound() -1 teruggeeft en LBound() geeft 0 terug:

Dim MyArray() As Integer
MsgBox(LBound(MyArray))  ' geeft weer : 0
MsgBox(UBound(MyArray))  ' geeft weer : -1

Sommige API-functies geven een array terug die elementen bevat (geïndexeerd vanaf nul) of geven ene lege array terug. Gebruik UBound() om te controleren of de teruggegeven array leeg is.

Waarden definiëren voor arrays

Waarden voor de velden Array kunnen als volgt worden opgeslagen:

 MyArray(0) = "eenwaarde"

Toegang tot arrays

Toegang krijgen tot waarden in een array werkt als volgt:

 MsgBox("Waarde:" & MyArray(0))

Voorbeeld voor maken van een array, toewijzen van waarden en toegang

Een voorbeeld dat alle stappen bevat die het echte gebruik van een array weergeven:

 Sub TestArrayAxess
 	Dim MyArray(3)
 	MyArray(0) = "lala"
 	MsgBox("Waarde:" & MyArray(0))
 End Sub


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools