Gambas: Variablen

Aus Wikibooks


zurück zu Gambas


Variablen[Bearbeiten]

Was sind Variablen?[Bearbeiten]

Eine Variable ist eine Größe, die verschiedene Werte annehmen kann. Sie ist also in ihrer Größe veränderlich. Variablen werden auch Platzhalter oder Unbekannte genannt. Sie kommen in Formeln und Termen vor.

Das Gegenteil einer Variablen ist die Konstante, also ein fester, unveränderlicher Wert. Die Kreiszahl Pi = 3,14... ist beispielsweise keine Variable, sondern eine Konstante.

Beispiele für Variable:

  • x,y,z im kartesischen Koordinatensystem
  • y = x^2
  • Temperatur t
  • Satz B

Für den Programmierer ist eine Variable ein Speicherbereich, auf den er (unter Beachtung des Datentyps) über einen eindeutigen Bezeichner (Namen) zugreifen kann. Das Variablen-Konzept ist der Kern der Imperativen Programmierung. Eine Variable muss in Gambas ausdrücklich deklariert werden.

Deklaration (Dimensionierung, Zuweisung des Datentyps)[Bearbeiten]

Es gibt zwei Haupttypen von Information, die in einer Variablen gespeichert werden kann: Zahlen und Text. Bevor eine Variable benutzt werden kann, muß sie zuerst erstellt werden. Das erfolgt mit dem Befehl DIM AS .

Beispiele für die Deklaration von Variablen:

DIM x AS integer
DIM y AS float
DIM z AS String

Man kann in einem Unterprogramm nicht dieselbe Bezeichnung für 2 verschiedene Variablen heranziehen.

Man kann Dim auch einfach weglassen:

x AS integer
y AS float
z AS String

Es gibt bisher keine Möglichkeit mehr als eine Variable in einer Zeile zu deklarieren:

intA, intB, intC AS Integer

Ist leider nicht möglich. Außerdem erfolgen die Deklarationen immer am Anfang eines Unterprogammes und nicht irgendwo wild im Code. Benoit ist da ganz streng. Die korrekte Deklaration von Variablen zeigt folgendes Miniprogramm

PUBLIC SUB Button1_Click()
'Deklaration
x AS integer
y AS float
z AS String
'Zuweisung von Werten 
x = 2
y = 2.378
z = "Das ist eine korrekte Deklaration"
'Benutzung der Variablen  
print x,y,z
END

Folgendes Programm dagegen ergibt eine Fehlermeldung: x already declared

PUBLIC SUB Button1_Click()
DIM x AS integer
DIM x AS float
DIM x AS String
x = 2
x = 2.378
y = "Das ist keine korrekte Deklaration"
print x,x,x
END

Auch im folgenden Programm gibt es Ärger, da zwischen kleinen und großen Buchstaben nicht unterschieden wird:

PUBLIC SUB Button1_Click()
DIM x AS integer
DIM X AS float
DIM x$ AS String
x = 2
X = 2.378
x$ = "Das ist eine korrekte Deklaration"
print x,X,x$
END

Die Deklaration von x$ ist korrekt.


Assignment (Wertzuweisung)[Bearbeiten]

Sobald eine neue Variable erstellt worden ist, kann ihr ein Wert zum Speichern zugewiesen werden. Um dies zu tun wird der Befehl = verwendet. Die Wertzuweisung wird im Englischen Assignment genannt.

Das Beispiel weist einer Variable die als Gewicht bezeichnet einen Wert zu.

Beispiel :

Gewicht = 80

Bei der Wertzuweisung muss man eine bestimmte Reihenfolge einhalten. Erst werden die Variablen deklariert, dann kann Ihnen ein Wert zugewiesen werden:

Variablen müssen am Anfang einer Klasse, Methode oder Funktion festgelegt werden.

Beispiel korrekt:

PUBLIC SUB bla()
  gewicht AS Integer
  groesse AS Integer
  gewicht = 75
  groesse = 176
END

Beispiel FALSCH !! (falsche Reihenfolge)

PUBLIC SUB bla()
  gewicht AS Integer
  gewicht = 75
  groesse AS Integer
  groesse = 176
END

Das letzte Beispiel ergibt die Fehlermeldung: Unknown identifier,groesse Zeile: xx in Form1.class

Wie kann man Variablen begrenzen[Bearbeiten]

Public, Private, Static

Globale Variablen soll es nicht geben. Optional wird nur bei der Methoden Deklaration verwendet.

Public - Private[Bearbeiten]

Geben Sie folgendes kleine Programm ein und schauen Sie zu, was passiert, wenn Sie auf den Button1 clicken:

PRIVATE SUB Button1_Click()
  DIM Zahl AS Integer 
  'Erstellen einer privaten lokalen Variable
  Zahl = Zahl + 1
  Textbox1.Text = Textbox1.Text & Zahl
END

Erstaunlicherweise wird in der Textbox kein Wert ausgegeben. Das liegt an der Kennzeichnung des Unterprogrammes mit PRIVATE. Tauschen Sie den Begriff PRIVATE mit PUBLIC aus und versuchen Sie Ihr Glück noch einmal:

PUBLIC SUB Button1_Click()
  DIM Zahl AS Integer 
  'Erstellen einer oeffentlichen lokalen Variable
  Zahl = Zahl + 1
  Textbox1.Text = Textbox1.Text & Zahl
END

Jetzt wird eine 1 in der Textbox ausgegeben. Wenn Sie mehrmals den Button anklicken, erscheint die 1 mehrfach.

Variablen allgemein definieren[Bearbeiten]

Variablen lassen sich auch außerhalb von Funktionen deklarieren, hier ein Beispiel:

PUBLIC meldung AS String
PUBLIC SUB Form_Open()
 meldung = "Dies ist ein Test"
END SUB
PUBLIC SUB Button1_Click()
 Message.Info(meldung)
END

Sie brauchen einen Commandbutton auf Ihrer Form, um das Beispiel in Gang zu bringen.

Form_Open ist ein Ereignis wie Button1_Click. Der Code zu diesem Ereignis wird bereits beim Programmstart aufgerufen, wenn die Form geladen und geöffnet wird. Hier wird die Variable mit Public außerhalb eines Unterprogrammes deklariert. Diese Variable ist also so lange verfügbar, wie die Formular geladen ist.

Ersetzen Sie den Begriff PUBLIC durch den Begriff PRIVATE und probieren Sie das Ergebnis aus.


PRIVATE meldung AS String
PRIVATE SUB Form_Open()
 meldung = "Dies ist ein Test"
END SUB
PRIVATE SUB Button1_Click()
 Message.Info(meldung)
END

Static (Statische Variable)[Bearbeiten]

Manchmal soll der Wert einer Variablen erhalten bleiben. Ruft man die Variable wieder auf, kann mit dem gemerkten Wert der Variablen weiter gearbeitet werden. Um dies zu ermöglichen gibt es den Deklarationsbefehl Static.

Wie er funktioniert zeigt folgendes Beispiel. Sie brauchen einen Befehlsknopf auf Ihrer Form um es in Gang zu bringen.

Static Public x As integer 
Public Sub Button1_Click()
 x = x + 1
 print x
End

Drückt man den Befehlsknopf wird erst x als 0 definiert. Dann wird in der Zeile x = x + 1 zur 0 die 1 dazugezählt. Mit Print x wird das Ganze im Direktfenster ausgegeben. Drückt man den Befehlsknopf mehrfach, dann erkennt man, daß das Programm sich den Wert für x gemerkt hat.

Ausgabe im Direktfenster:

1
2
3
4
5

Das Wort Static sorgt dafür, daß der Wert einer Variablen nicht einfach verschwindet. Wird sie ein zweites Mal aufgerufen, steht automatisch der alte Wert wieder zur Verfügung.

Versuchen Sie folgende Variante:

Public Sub Button1_Click()
 x As integer 
 x = x + 1
 print x
End

Drücken Sie den Befehlsknopf mehrfach. Welche Ausgabe ergibt sich?

1
1
1
1

Die Unterfunktion setzt den Wert der Variablen immer wieder auf Null zurück. Beachten Sie das die statische Variable im Gegensatz zu Visual Basic außerhalb des Unterprogrammes definiert werden muß.

Wären Sie enttäuscht, wenn das ganze auch ohne Static und Public funktioniert? Probieren Sie folgenden Code aus:

x As integer 
Public Sub Button1_Click()
 x = x + 1
 print x
End

Globale Variablen in Gambas[Bearbeiten]

Benoit Minsini mag sie nicht. Aber sie sind möglich und m.E. auch ganz praktisch.

Siehe Gambas:_Form#Globale_Variablen_in_Gambas

Eine andere Möglichkeit über den Umgang mit globalen Variablen zeigen die nachstehenden Beispiele:

In einem umfangreichen Gambas Projekt werden mehrere Formen und Module verwendet. Globale Variablen, die für das gesamte Projekt gelten, gibt es in Gambas nicht. Es ist jedoch sinnvoll von Formen oder Modulen auf die Variablen anderer Formen oder Module zugreifen zu können. Wie das funktioniert wird nachstehend gezeigt. Wir benötigen eine Form mit einem Befehlsknopf und einem Textfeld als Ergebnisanzeige. Des weiteren benötigen wir ein Modul, in dem mit den Variablen aus der Form gerechnet wird.

Auslesen von öffentlichen Variablen in einer Form1 aus einer Prozedur in einem Modul.

Programmcode der Form1:

PUBLIC a AS Float
PUBLIC b AS Float
' Die Variablen sind öffentlich und sind gültig in allen Prozeduren und Funktionen in der Form1. 
PUBLIC SUB Button1_Click()
 DIM c AS Float
 ME.Text ="Beispiele"
 a = 3.2
 b = 7.4
 c = Module1.RechnenVariable()
  textbox1.Text = Str(c)
END
 

Programmcode von Module1:

PUBLIC FUNCTION  RechnenVariable() AS Float
 DIM c AS Float  
 c = form1.a  + form1.b 
 RETURN c 
END

Bei Betätigung der Befehlsschaltfläche werden zunächst den Variablen a und b Werte zugewiesen. Mit dem Aufruf der Function RechenVariable in Module1 werden die Werte der Variablen a und b der Form1 ausgelesen, dann addiert und als Rückgabewert der Function wieder an die aufrufende Prozedur Sub Button1 zurückgegeben. Das Ergebnis wird in der Textbox1 als Float-Variable ausgegeben.

Genau so einfach wie das Auslesen der Variablen ist das Zuweisen von Werten für die Variablen a und b der Form1 über eine Prozedur von Module1.

Programmcode der Form1:

PUBLIC a AS Float
PUBLIC b AS Float
PUBLIC SUB Button1_Click()
 ME.Text ="Beispiele"
 Module1.RechnenVariable()
 textbox1.Text = Str(a + b)
END

Programmcode von Module1

PUBLIC SUB RechnenVariable()
 form1.a = 10.2
 form1.b = 2.5
END

Etwas komplizierter ist das Auslesen von Variablen aus einem Array, da das Ansprechen der Arrayvariable aus dem Modul mit dem Code c = form1.a[5] nicht funktioniert. Daher wird in Form1 eine öffentliche Prozedur programmiert, die auf das Array zugreifen kann. Zum Auslesen des Array wird von dem Modul auf diese öffentliche Prozedur zugegriffen. Hier ist der Code für die Form1:

d[10] AS Float
' das Array wird ohne PUBLIC deklariert. Mit Public d[10] AS Float gibt Gambas eine Fehlermeldung aus.
' ein Array kann nur im Kopf von Formen deklariert werden. Bei der Deklaration im Kopf von  'Modulen gibt Gambas ebenfalls eine Fehlermeldung aus.
' Die Zählung für den Arrayinhalt beginnt bei 0 (d[0] = ..), während die Zählung für die Deklaration bei 1 beginnt
' Das Array ist öffentlich und ist gültig in allen Prozeduren und Funktionen der Form1.
PUBLIC SUB Form_Open()
 DIM i AS Integer
 ME.Text ="Beispiele"
 FOR i = 0 TO 9
   d[i] = i * 1.2    'Array wird mit willkürlichen Werten gefüllt.
 NEXT  
END
PUBLIC FUNCTION d_aus (x AS Integer) AS Float
 DIM wert AS Float
 wert = d[x]
 RETURN wert
END  
PUBLIC SUB Button1_Click()
 DIM c AS Float
 c = Module1.RechnenArray()
 textbox1.Text = Str(c)
END

Programmcode von Module1:

PUBLIC FUNCTION  RechnenArray() AS Float
 DIM c AS Float  
 c = form1.d_aus(2)  + form1.d_aus(5)
 RETURN c 
END

Zunächst wird in der Prozedur Open() das Array mit Werten gefüllt. Mit dem Aufruf der Function RechenArray in Module1 wird zweimal die Function d_aus in der Form 1 aufgerufen und die Inhalte von d[2] bzw. d[5] ermittelt und an die Funktion Rechenarray zurückgegeben. Dort werden sie dann adddiert und als Rückgabewert der Function Rechenarray wieder an die aufrufende Prozedur Sub Button1 zurückgegeben. Das Ergebnis wird in der Textbox1 als Float-Variable ausgegeben.

Das Zuweisen von Werten für das Array erfolgt ähnlich. Anstatt Funktionen werden in diesem Beispiel Prozeduren benötigt, da die Werte übergeben und nicht ausgelesen werden. Der dafür erforderliche Code für die Form1 lautet:

d[10] AS Float
PUBLIC SUB Form_Open()
 DIM i AS Integer
 ME.Text ="Beispiele"
 FOR i = 0 TO 9
   d[i] = i * 1.2       'Array wird mit willkürlichen Werten gefüllt.
 NEXT  
END
PUBLIC SUB d_ein (wert AS Float, x AS Integer) 
  d[x] = wert
END  
PUBLIC SUB Button1_Click()
 DIM c AS Float
 Module1.RechnenArray()
 textbox1.Text = Str(d[5])
END


Programmcode von Module1:

PUBLIC SUB  RechnenArray() 
 DIM wert AS Float
 wert = 12.7
 form1.d_ein (wert, 5) '5 ist willkürlich gewählt
END

Bei einem zweidimensionalen Array lautet der Code der Form1 für das Auslesen von Werten:

d[10,5] AS Float
PUBLIC SUB Form_Open()
 DIM i AS Integer
 DIM j AS Integer
 ME.Text ="Beispiele"
 FOR i = 0 TO 9
   FOR  j = 0 TO 4
     d[i,j] = i * 1.2 + j    'Array wird mit willkürlichen Werten gefüllt.
   NEXT  
 NEXT  
END
PUBLIC FUNCTION d_aus (x AS Integer, y AS Integer) AS Float
 DIM wert AS Float
 wert = d[x,y]
 RETURN wert
END  
PUBLIC SUB Button1_Click()
 DIM c AS Float
 c = Module1.RechnenArray()
 textbox1.Text = Str(c)
END

Programmcode von Module1:

PUBLIC FUNCTION  RechnenArray() AS Float
 DIM c AS Float  
 c = form1.d_aus(5,2)  + form1.d_aus(8,4)
 RETURN c 
END

Bei einem zweidimensionalen Array lautet der Code der Form1 für die Übergabe von Werten:

d[10,5] AS Float
PUBLIC SUB Form_Open()
 DIM i AS Integer
 DIM j AS Integer
 ME.Text ="Beispiele"
 FOR i = 0 TO 9
   FOR  j = 0 TO 4
     d[i,j] = i * 1.2 + j    'Array wird mit willkürlichen Werten gefüllt.
   NEXT  
 NEXT  
END
PUBLIC SUB d_ein (wert AS Float, x AS Integer, y AS Integer) 
  d[x,y] = wert
END  
PUBLIC SUB Button1_Click()
 Module1.RechnenArray()
 textbox1.Text = Str(d[5,2])
END

Programmcode von Module1:

PUBLIC SUB  RechnenArray() 
 DIM wert AS Float
 wert = 12.7
 form1.d_ein (wert, 5,2) '5 und 2 sind willkürlich gewählt
END

In allen Beispielen wurde mit Fließkommazahlen experimentiert. Durch geringfügige Änderungen der Prozeduren und Funktionen kann natürlich auch mit Integervariablen, mit Strings, mit Datevariablen oder auch mit Booleanvariablen gearbeitet werden. Es ist auch nicht kompliziert auf die Inhalte von Textboxen zuzugreifen, die Textboxen mit Inhalten zu füllen oder auch Labeltexte auszulesen oder zu ändern.