Dim, eeDim

Mittels Dim (Arbeitsspeicher) und eeDim (Eeprom) werden Variablen dimensioniert/angelegt.

Syntax:

  • Dim Name[(Elemente)] [, NameN[(Elemente)]] as [static] Datatype [= InitialValue]1)
  • eeDim Name[(Elemente)] [, NameN[(Elemente)]] as Datatype [= InitialValue]2)
  • Innerhalb einer Klasse dimensionierte Variablen sind in der gesamten Klasse lokal und statisch (static). D.h. z.Bsp. im Hauptprogramm (Klasse „Avr“) dimensionierte Variablen sind auch in Methoden des Hauptprogramms sichtbar, sofern keine gleichnamige Variable innerhalb der Methode dimensioniert wurde. Jedoch sind sie nicht in einer anderen Klasse sichtbar. Auf Elemente anderer Klassen kann jedoch zugegriffen werden durch Klassenname.Eigenschaft bzw. Methode
  • In Methoden dimensionierte Variablen sind innerhalb der Methode lokal (also nur in der Methode sichtbar) und wahlweise temporär oder statisch (static).
  • In Interrupt-Serviceroutinen (ISR) dimensionierte Variablen sind innerhalb der Isr lokal (also nur in der Isr sichtbar) aber zwingend statisch (static) anzulegen.
  • Eeprom-Variablen können nur in Klassen, z.Bsp. im Hauptprogramm (der Klasse „Avr“) dimensioniert werden, nicht in Unterprogrammen. Sie sind ebenfalls statisch.

Wird in einer Klasse, z.Bsp. im Hauptprogramm eine Variable mit dem Namen „myVar“„ und in einer seiner Methoden ebenfalls eine Variable mit dem Namen „myVar“ dimensioniert (als Parameter oder lokale Variable), dann wird die Variable der Methode bevorzugt behandelt. D.h. die Variable der Klasse wird innerhalb der Methode ausgeblendet (versteckt).

Mit static werden die Variablen in einer Methode statisch angelegt. D.h. sie sind schon ab Beginn des gesamten Programms im Arbeitsspeicher dimensioniert und werden beim Aufruf einer Methode (im Gegensatz zu temporären Variablen) nicht initialisiert3) (nur beim Start des Controllers) und behalten somit ihre Werte vom letztmaligem Ausführen der Methode. Die Ausführungsgeschwindigkeit ist um Einiges schneller als bei temporären Variablen. Hierbei ist jedoch zu beachten, dass man die Methode dann nicht parallel mehrfach ausführen sollte, da die parallel ausgeführten Methoden dann auf dieselbe Variable zugreifen. Dies kann zu Fehlern führen, die schwer zu finden sind.

Standardmäßig werden die Variablen temporär innerhalb einer Methode angelegt, d.h. sie existieren nur solange die Methode ausgeführt wird.

Implementiert ab Version 2015.r1

InitialValue ist eine Funktionalität, mit der man den numerischen- und string-Variablen bei der Dimensionierung optional einen Startwert zuweisen kann (auch in Methoden). Hierbei werden alle angegebenen Variablen, auch Arrays mit dem Initialwert belegt.

dim a,b(7) as byte = 42
dim s as string = "hallo"

Allgemein

  • Bei der Dimensionierung von Strings ist zu beachten, dass Stringdaten im Arbeitsspeicher dynamisch sind und im Eeprom statisch. Dimensionierung von Stringvariablen im Eeprom bedürfen daher der zusätzlichen Angabe der statischen Länge (Anzahl Zeichen).

Eeprom

  • Das Lesen und Schreiben von Eeprom-Variablen ist sehr langsam und die Anzahl der möglichen Schreibzugriffe durch die Hardware begrenzt. Daher Eeprom-Variablen nicht in Schleifen dauerhaft beschreiben!
  • Eepromvariablen werden zu Programmstart logischerweise nicht wie Arbeitsspeicher-Variablen mit dem Wert 0 initialisiert.

Beispiel Dimensionierung Arbeitsspeicher

dim a,b as byte
dim c(19) as integer    ' Word-Array mit 20 Elementen
dim s1 as string
dim s2(4) as string     ' String-Array mit 5 Elementen
procedure hallo(a as byte)
  dim c(19) as static integer    ' statisches Word-Array mit 20 Elementen
  dim s1 as string
endproc

Beispiel Dimensionierung Eeprom

eedim a,b as byte
eedim c(19) as integer      ' Word-Array mit 20 Elementen
eedim s1[20] as string      ' String mit 20 Zeichen Speicherplatz
eedim s2[10](4) as string   ' String-Array mit 5 Elementen, jeweils 10 Zeichen Speicherplatz
1) , 2) as of Version 2015.r1
3) Luna initialisiert Variablen, Objekte und Strukturen die Werte speichern mit dem Wert nil, was dem Zahlenwert 0 entspricht.