Strukturen
Struct-EndStruct
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.
Deklaration
- Struct Bezeichner
- [..]
- EndStruct
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
Verwendung
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"
Strings in Strukturen (dimensioniert)
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.
Struktur-Arrays
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" [..]