Arrays (matrices)

From Apache OpenOffice Wiki
< NL‎ | Documentation‎ | BASIC Guide
Revision as of 13:34, 21 January 2013 by DiGro (Talk | contribs)

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 wordne 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.

Dynamic Changes in the Dimensions of Data Fields

The previous examples are based on data fields of a specified dimension. You can also define arrays in which the dimension of the data fields dynamically changes. For example, you can define an array to contain all of the words in a text that begin with the letter A. As the number of these words is initially unknown, you need to be able to subsequently change the field limits. To do this in Apache OpenOffice Basic, use the following call:

ReDim MyArray(10)
Documentation note.png VBA : Unlike VBA, where you can only dimension dynamic arrays by using Dim MyArray(), Apache OpenOffice Basic lets you change both static and dynamic arrays using ReDim.


The following example changes the dimension of the initial array so that it can record 11 or 21 values:

Dim MyArray(4) As Integer ' Declaration with five elements 
' ...
ReDim MyArray(10) As Integer ' Increase to 11 elements
' ... 
ReDim MyArray(20) As Integer ' Increase to 21 elements

When you reset the dimensions of an array, you can use any of the options outlined in the previous sections. This includes declaring multi-dimensional data fields and specifying explicit start and end values. When the dimensions of the data field are changed, all contents are lost. If you want to keep the original values, use the Preserve command:

Dim MyArray(10) As Integer ' Defining the initial 
' dimensions
' ... 
ReDim Preserve MyArray(20) As Integer ' Increase in 
' data field, while
' retaining content

When you use Preserve, ensure that the number of dimensions and the type of variables remain the same.

Documentation note.png VBA : Unlike VBA, where only the upper limit of the last dimension of a data field can be changed through Preserve, Apache OpenOffice Basic lets you change other dimensions as well.


If you use ReDim with Preserve, you must use the same data type as specified in the original data field declaration.

Determining the Dimensions of Data Fields

Functions LBound() and UBound() return respectively the lowest permitted index value and the highest permitted index value of an array. This is useful when an array has changed its dimensions.

Dim MyArray(10) As Integer
' ... some instructions
Dim n As Integer
n = 47 ' could be the result of a computation
Redim MyArray(n) As Integer
MsgBox(LBound(MyArray))  ' displays : 0
MsgBox(UBound(MyArray))  ' displays : 47

For a multi-dimensional array you need to specify the position (1 to n) of the index you want to know the permitted lower and upper values:

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

Empty arrays

In some cases, especially when dealing with the API, you need to declare an empty array. Such array is declared without dimension, but may later be filled by an API function or with a Redim statement:

Dim s() As String ' declare an empty array
' --- later in the program ...
Redim s(13) As String

You cannot assign a value to an empty array, since it does not contain any elements.

The "signature" of an empty array is that UBound() returns -1 and LBound() returns 0:

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

Some API functions return an array containing elements (indexed from zero) or return an empty array. Use UBound() to check if the returned array is empty.

Defining values for arrays

Values for the Array fields can be stored like this:

MyArray(0) = "somevalue"

Accessing Arrays

Accessing values in an array works like this:

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

Array Creation, value assignment and access example

And example containing all steps that show real array usage:

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


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