Strukturen

Mit Struct/EndStruct können benutzerdefinierte Strukturen angelegt werden.

Eine Struktur ist ein aus mehreren verschiedenen Datentypen bestehendes Speicher-Objekt. Es werden die in ihr definierten einzelnen Datentypen strukturiert unter einem einzelnen Namen zusammengefasst.

Sichtbarkeit

Deklarierte Strukturen sind innerhalb ihrer Klasse sichtbar. Dies bedeutet, eine im Hauptprogramm (Basisklasse „Avr“) deklarierte Struktur ist innerhalb einer anderen Klasse unbekannt.

  • Bis Version 2014.r2.4: Wenn Daten unter Nutzung einer Struktur zwischen Klassen getauscht werden sollen, muss die dafür verwendete Strukturdeklaration nochmalig in der jeweiligen Klasse vorgenommen werden. Die Deklarationen dürfen sich nicht unterscheiden, da es sonst zu Speicherverletzungen kommen kann.
  • Ab der Version 2015.r1 sind Strukturdeklarationen auch über den Klassennamen verwendbar. D.h. ist in einer Klasse eine Struktur definiert, kann diese auch im Hauptprogramm zur Dimensionierung von Strukturen genutzt werden und umgekehrt. Die oben genannte Einschränkung bis Version 2014.r2.4 ist damit aufgehoben.
struct mystruct_t
  byte   value
  string text[20]
endstruct
 
dim var1 as mystruct_t          'the global structure type
dim var2 as myclass.mystruct_t  'the class-internal structure type
 
[...]
 
class myclass
  struct mystruct_t
    byte   value
    word   id
    string text[20]
  endstruct
 
  dim var1 as avr.mystruct_t  'the global structure type
  dim var2 as mystruct_t      'the class-internal structure type
 
  [...]
endclass

Bevor man eine Struktur im Programm verwenden kann, muss man die Struktur deklarieren. Die Deklaration erfolgt mit Struct/EndStruct. Die Deklaration einer Struktur belegt keinen Speicherplatz. Der Speicherplatz wird erst alloziert, wenn man eine Variable als Struktur mit Dim in einem Speicherbereich (Arbeitsspeicher oder Eeprom) dimensioniert. Eine bereits deklarierte Struktur kann wiederum in einer weiteren Struktur implementiert werden.

Strukturen sind in in sich selbst statisch. Dies bedeutet, dass auch Strings immer eine feste Länge benötigen (wie bei der Dimensionierung im Eeprom). Strukturen belegen bei einer Dimensionierung dann so viele Bytes im Arbeitsspeicher oder Eeprom, wie alle in der Struktur vorhandenen Elemente an Speicherplatz zusammen benötigen.

SuperImposing

Die Strukturdeklarationen können auch für eine einfachere Ablage von Daten in Datenobjekten, oder als eine Art Maske für Speicherbereiche verwendet werden. Siehe hierzu: Pointer, Absatz "SuperImpose"

Bei der Zuweisung von Strings/Zeichenketten an String-Elemente von dimensionierten Strukturen werden sie automatisch als Pascal-String gespeichert. D.h. das erste Zeichen im Speicher ist das Längenbyte. Dies bei der Größenangabe in Strukturelementen beachten, die im Arbeitsspeicher dimensioniert werden sollen.

Strukturen können als Array dimensioniert werden, womit Felder mit mehreren Elementen je Array-Element möglich werden.

Beispiel1:

[..]
' Struktur deklarieren
struct point
  byte x
  byte y
endstruct
 
dim a(3) as point  ' Array mit 4 Elementen des Typs "point" dimensionieren
 
a(0).x = 1
a(0).y = 20
a(1).x = 23
a(1).y = 42
[..]

Beispiel2:

[..]
' Struktur deklarieren
struct buffer
  byte   var(7)
  string text[4](2)  ' String Array mit 3 Elementen
endstruct
' Struktur deklarieren
struct mydate
  byte    sec
  byte    min
  byte    hour
  byte    month
  word    year
  buffer  buf       ' verschachtelte Strukturen möglich
  string  text[12]  ' Stringspeicher mit max. 11 Zeichen (1 Länge + 11 Daten)
endstruct
 
dim d as mydate  ' Struktur dimensionieren
 
d.sec = 23
d.min = 42
d.hour = 12
d.mon = 2
d.year = 2012
d.text = "hello"
d.buf.var(4) = 123
d.buf.text(0)="ABC"
 
[..]