3.7 Welche Variablentypen gibt es?
Zeichenfolgen

Zeichenfolgen sind Variablen die Textzeichen beinhalten. Zeichenfolgen, im englischen "Strings" bezeichnet, werden für die Verarbeitung von Text verwendet.
Man kann Inhalte vergleichen, löschen oder kürzen. In Starbasic heißen sie String-Variablen. Um eine Variable als String zu deklarieren verwendet man folgende Zeilen

Dim MyText as String
oder
Dim MyText$

Innerhalb einer solchen Variable können sie Zeichenfolgen mit einer maximal Länge von bis zu 65535 Zeichen speichern. Also eigentlich ein ganze Menge.
Um einer String-Variablen einen Wert zu zuordnen muß man den gewünschten Text in Hochkammas einklammern:

MyText = "Dies ist ein Text"

Wenn der Text länger wie eine Zeile wird, muß man in mehrere Zeilen schreiben und jede Zeile mit einen Hochkomma beginnen und beenden, und die einzelnen Zeilen mit einem Plus- Zeichen ( + ) und dem Verbindungszeichen für Programmzeilen, dem Unterstrich ( _ ), verbinden.

MyText = "Dies ist ein Text um einmal die Länge einer Zeile aus " + _
"zu probieren!"

Wenn man ein Abführungszeichen in seiner Zeichenfolge benötigt wird, muß dieses doppelt eingefügt werden:

MyText = "Dies ist ein Test mit dem "" Zeichen" ergibt dann
Dies ist ein Test mit dem " Zeichen.

Zahlen

Zahlen sind natürlich für fast jedes Programm wichtig. Innerhalb von StarBasic gibt es verschiedene Typen von Zahlenvariablen. Eine der wichtigsten Unterscheidung, in allen Programmiersprachen, ist die Trennung in ganzzahlige Variablentypen und Fließkommatypen. Grob entpricht das der mathematischen Einteilung in ganze und rationale Zahlen.

Es gibt in Starbasic die folgenden Zahlentypen:

Integer
Long Integer
Single
Double
Currency


Integer

Integer Variablen können nur ganze Zahlen zwischen -32768 und 32767 aufnehmen. Fließkommazahlen werden bei einer Zuweisung automatisch kaufmännisch gerundet bzw. abgerundet.

Die Deklarion erfolgt mit

Dim MyInt as Integer
oder
Dim MyInt%

Long Integer

Integer Variablen können nur ganze Zahlen zwischen -2.147.483.648  und 2.147.483.647 aufnehmen. Fließkommazahlen werden bei einer Zuweisung automatisch kaufmännisch gerundet bzw. abgerundet.

Die Deklarion erfolgt mit

Dim MyLongInt as Long
oder
Dim MyLongInt&

Single

Single-Variablen sind Fließkommazahlen. Sie können positive und negative Werte halten
zwischen 3,402823 * 10 38 und 1,401298 * 10-45.Ursprünglich wurden Single-Variablen konzipiert, um den Rechner bei der
Ausführung mathematischer Operationen nicht so stark wie beim Umgang mit den
genaueren Double-Variablen zu belasten.

Die Deklartion erfolgt über
Dim MySingle as Single
oder
Dim MySingle!

Double

Double-Variablen sind Fließkommazahlen. Sie können positive und negative Werte
zwischen 1,79769313486263 * 10 308 und 4,94065645841247 * 10 -324  aufnehmen. Double-
Variablen sind geeignet für genaue Berechnungen

Die Deklartion erfolgt über
Dim MyDouble as Double
oder
Dim MyDouble#

Currency

Währungsvariablen (Currency-Variablen) sind wie Integer-, Long Integer-, Single- und
Double-Variablen für die Aufnahme von Zahlen gedacht.  Die Position des Kommas ist dabei Curruncy festfix, weshalb sie auch keine
Fließkommavariablen sind. Sie haben immer genau vier vier Nachkommastellen.
Vor dem Komma können maximal 15 Ziffern stehen. Daher können Currency Variablen zahlen zwischen
-922.337.203.685.466,5808 und -922.337.203.685.466,5807 enthalten. Diese ungenaue Begrenzung, und nicht -999.999.999.999.999.,9999 bis 999.999.999.999.999,9999 liegt an dem internen Speicherformat in 8 Byte. ????? Anhang ????
Währungsvariablen sind insbesondere für kaufmännische Kalkulationen gedacht, bei
denen durch die Verwendung von Fließkomma-Zahlen unvorhersehbare Rundungsfehler
entstehen können.

Deklaration einer Currency-Variablen:

Dim MyCurrency as Currency
oder
Dim MyCurrency@


Verwendung  von Zahlen im Programmcode

Für die Verwendung von Zahl im Programmcode gelten einige kleine Regeln:

Ganze Zahlen werde so verwendet wie man es sich vorstellt:
A=1,
B=34,
C= -56

Fließkommazahlen müssen als Kommazeichen einen Punkt haben:

D = 12.67
E = 1345.948484

Zahlen können auch in er Expontailschreibweise verwendet werden. Dies ermöglicht
eine einfache Darstellung von sehr großen und sehr kleinen Zahlen. Hier bei gilt dann
Zwischen der Zahl und dem Exponenten darf kein Leerzeichen und der Exponent muß eine ganze Zahl sein.

F = 1.43E10
G = 2.56E-10
H = -3.22E5

Zahlen als Hexadezimalzahl können durch eine vorgestelltes "&H" zugewiesen werden. Das Hexadezimalsystem (16er System) hat den Vorteil, dass zwei Ziffern jeweils exakt einem Byte entsprechen, was einen maschinennahen Umgang mit Zahlen gestattet. Als Ziffern kommen beim Hexadezimalsystem die Ziffern 0 bis 9 sowie die Buchstaben A bis F zum Einsatz. Ein A steht für die Dezimalzahl 10, ein F für die Dezimalzahl 15. StarOffice Basic gestattet die Eingabe ganzzahliger Hexadezimalwerte.

I = &HFF  ' FF steht 255 Decimal in Hexadecimal

Zahlen als Oktalzahl ( 8er-System können mit einem vorgestellten "&O" zugewiesen werden. Diese Zahlenformat wird jedoch sehr selten benötigt.

J= &O377 ' Entspricht Decimal 255.


Logisch

Eine Variable vom Typ Boolean kann nur zwei Werte annehmen Wahr oder Falsch (true oder false). Mit dieser Variable kann man einen Zustand feststellen oder setzen, die nur zwei mögliche Zustände hat. Intern wird dabei mit 0 (für "Falsch") und 1 (für "Wahr") gearbeitet. Im allgemeinen Sprachgebrauch der Programmiersprachen  handelt es sich eine boolsche Variable. Die beste deutsche Bezeichnung ist dafür logische Variable. Die Bezeichnung Boolean kommt von dem englischen Mathematikers George Boole. Er hat die nach ihm benannte Bool'sche Algebra entwickelt. Die logischen Operatoren, deren Bescheibung noch folgt, basieren auf der Bool'schen Algebra.

Die Deklaration erfolgt mit

Dim bWahr as Boolean

Setzen und  Abfragen einen boolschen Variabe kann  über True oder False und "1" oder "0" erfolgen
"bBool = 1" hat die gleiche Wirkung wie "byBool=True".

Datum/Zeit

Date-Variablen können Datums- und Zeitwerte enthalten. Bei der Speicherung von
Datumswerten verwendet StarBasic ein internes Format, das Vergleiche und mathematische
Operationen erlaubt.

Dim MyDate as Date

Datenfelder / Arrays

Eindimensionale Datenfelder

Starbasic unterstützt zusätzlich zu den einfachen Variablen auch Datenfelder. Datenfelder (arrays) können mehrer Variablen eines Type enthalten. Diese werden über den Index des Datenfeldes angesprochen. Mit Datenfeldern kann man zum Beispiel Gruppen von Variablen zusammen fassen.

Einfache Arrays werden mit der Zusatzangabe über die Anzahl der Elemente deklariert:

Dim MyArray(3)
oder
Dim MyArray(3) as Typ

Auch hier wird wieder unterschieden zwischen einer Deklartion im Typ Variant und einer spezifischen Typendeklaration. Hier gilt auch wieder Vorsicht mit dem Typen Variant! Man kann den einzelnen Daten verschiedene Typen zuordnen. In dem Beispiel wird ein Array von vier Elementen erzeugt. Warum es vier Elemente und drei erklären wir gleich.

Der Index eines Datenfeldes beginnt standardmäßig bei Null. Das heißt die eigentlichen Daten lassen sich über den Index von 0 bis Deklaration - 1 ansprechen.

MyArray(0) = 1
MyArray(1) = 1
MyArray(2) = 1
MyArray(3) = 1

Man kann den Index auch selber festlegen in dem man den Bereich einträgt. So kann man mit der Dekalaration

Dim MyArray( 1 to 4)  as String

ebenfalls einen Array mit vier Elementen festlegen. Dieses wird dann über die Indices 1 bis 4 angesprochen. Diesen Bereisch kann man auch negative festlegen.

Dim MyArray(-3 to -10) as Integer

legt eine Array mit den entsprechenden Indices zwischen -3 und -10 fest.

Wenn man sich die möglichen  Bereiche mit der Funktion x to y anschaut wird klar, warum wir oben vier Elemente erhalten haben. Starbasic interpretiert die vorhandene Zahl als y und setzt dann null als Startwert.

Für Datenfelder und Indices gelten folgende Regeln:
     
     Der kleinste erlaubte Index ist -32768.
     Der größte erlaubte Index ist 32767.
     Die maximale Anzahl an Elementen beträgt 16368. Also nicht die naheliegende Differenz zwischen minimalen und maximalen Index (65535).

Zusätzlich besteht in Starbasic die Möglichkeit den Startindex für Datenfelder dauerhaft auf eins einstellen. Mit dem Befehl

Option Base 1

oberhalb aller Module erfolgt diese Zuweisung. Diese hat jedoch einen Haken. Durch diese Anweisung wird nur der Index eines Datenfeldes auf eins gesetzt. Die Anzahl der Elemente bleibt aber erhalten. In unserem Beispiel von oben Dim MyArray(3) erhält man also wieder vier Elemente, diesmal mit den Indices eins bis vier.


Mehrdimensionale Datenfelder

Zusätzlich zu den eindimensionalen Datenfeldern ist es in Starbasic auch möglich mehrdimensionale Datenfelder anzulegen. Die betreffenden Dimensionen werden dabei durch Kommata getrennt.

Dim MyArray(3,3) as String

Mit einem solchen Array lassen sich dann insgesamt 16 String-Werte zuweisen die über die beiden Indices 0 bis 3 ansprechbar sind. Das beste Beispiel für einen solches Datenfeld ist eine Tabelle. Jedes Tabellenfeld läßt sich genau über zwei Indices ansprechen: Zeile und Spalte.

Theoretisch lassen sich in Starbasic Datenfelder mit mehreren hundert Dimensionen anlegen. In der Praxis sind aber mehr wie drei Dimension schwer pflegbar. Zur Verdeutlichung: Zwei Dimensionen sind eine Tabelle, drei Dimensionen sind eine drei dimensionales Koordinatensystem, vier Dimensionen ...... usw.

Dynamische Änderung von Datenfeldern.

Bisher haben wir nur Datenfelder deklariert deren Größe wir Anfang des Programmes kennen und die sich nicht ändert. Mit Starbasic lassen sich aber auch Datenfelder im laufenden Programm dimensionieren. Nicht immer lassen sich die Dimension vorher festlegen, sondern sie werden im Ablauf des Programmes erst bekannt. Mit dem Befehl Redim ist eine Neudimensionierung möglich. Das einzige Problem dabei ist das eingetragene Wert verloren gehen.

Redim MyArray(5) as String

erzeugt also eigentlich nur im laufenden Programm das Datenfeld mit neuer Dimension neu. Manchmal hat man aber ein Array und muß es nur vergrößern und möchte die Daten nicht verlieren. Dazu gibt es den Befehl "Redim Preserve".

Redim Preserve MyArray(10) as String

vergrößert also das Datenfeld in unserem Beispiel von fünf auf zehn und die vorhandenen Daten bleiben bestehen. Wichtig ist dabei nur darauf zu achten das sich die Dimension und der Typ nicht ändert. Das ist nämlich nicht zulässig.

Zulässig ist aber auch die Verkleinerung eines Datenfeldes. Dabei werden dann die oberen Werte gelöscht.

Wenn man ein Array auswerten muß, von dem man die Größe nicht kennt, zum Beispiel als Ergebnis eine Funktion, kann mit diese mit Ubound erfahren.

anzahlfelder = ubound(array()).

Dabei ist immer daran zu denken das die Null das erste Element ist. Ist die Anzahl zum  Beispiel 10 ist die Gesamtanzahlfelder 11.

Das Gegenstück zu ubound ist lbound. Damit wird der unterste Werte des Arrays bestimmt.

Bei mehrdimensionalen Feldern wird die Dimension bei der Abfrage mit übergeben.

Dim TestArray (2,8)
TestAnzahl = uBound(Testarray(),2)

Achtung! Die Zählung der Dimensionen beginnt hier bei 1, und nicht bei 0.

Konstanten

Zusätzlich zu Variablen lassen sich auch Konstanten deklarieren. Konstanten können nicht überschrieben. Das heißt sie bleiben für den gesamten Ablauf des Programmes erhalten. Deklariert werden sie mit const.

const Konstante as Typ = Wert

Wahlweise kann man die Typendeklaration auch weglassen: const Konstante = Wert.

Konstanten machen dann Sinn wenn man weiß das man bestimmte Werte in mehreren Modulen benötigt und diese sich nicht ändern. Ein Beispiel wäre der Euroumrechnungsfaktor. Wenn dieser sich ändern sollte, muß man nur an einer Programmstelle den Wert ändern.

Variant

Der Datentyp Variant wird in Starbasic automatisch erstellt wenn eine Variable ohne Typenzuordnung deklariert wird.

Variable = 1

Eine derartige Varibale kann dann auch verschiedene Typen nacheinnander aufnehmen.

sub varianttest
  var1 = "Test"
  msgbox var1
  var1 = 1
  msgbox var1
end sub

In diesem Beispiel bekommt Var1 erst eine Zeichenfolge und dann eine ganze Zahl. Der Typ Variant macht sich die Variable bei der Weiterverarbeitung passend. Wenn man zum Beispiel zwei Variantvariablen addiert und die eine hat einen String und die andere eine Zahl, wird das richtige Ergebnis berechnet wenn der String eine Zahl ist. Ansonsten kommt keine Fehlermeldung, aber ein falsches Ergebnis. Daher ist der Einsatz von Variantvariablen mit Vorsicht zu geniessen. Man kann sich damit "schöne" Fallen in seinen Code schreiben.

Tipp: Alle Variablen ordentlich deklarienen und auf den Typ Variant möglichst verzichten.