Interne Tabellen sind genau dann zuweisbar, wenn ihre Zeilentypen konvertierbar sind. Die Regel, wann Struktur einander zugeweisen werden können ist leider recht kompliziert. Wichtig ist jedoch, dass
das Zielfeld mit Initialwerten aufgefüllt wird.
Die Online-Dokumentation gibt folgende Auskunft:
Konvertierung zwischen flachen Strukturen Strukturen außerhalb von Unicode-Programmen Außerhalb von Unicode-Programmen werden die beteiligten flachen Strukturen als Einzelfelder vom Typ c betrachtet (Casting), deren Länge durch die Länge ihrer Komponenten und mögliche Ausrichtungslücken bestimmt wird. Die Zuweisung zwischen den Strukturen erfolgt dann nach den Konvertierungsregeln für den Datentyp c. Insbesondere werden bei der Zuweisung einer kürzeren Struktur in eine längere die Komponenten am Ende der Zielstruktur nicht typspezifisch initialisiert, sondern mit Leerzeichen aufgefüllt.
Hinweis Zuweisungen dieser Art sind nur dann sinnvoll, wenn die beteiligten Strukturen ausschließlich zeichenartige oder byteartige Komponenten besitzen.
Flache Strukturen in Unicode-Programmen Für die Konvertierung flacher Strukturen in Unicode-Programmen spielt die Unicode-Fragmentsicht der beteiligten Strukturen eine Rolle.
Unicode-Fragmentsicht Die Unicode-Fragmentsicht zerlegt eine Struktur in Fragmente. Ein Fragment ist eine Zusammenfassung von Strukturkomponenten gleicher oder ähnlicher Datentypen bestimmter Länge. In geschachtelten Strukturen werden bei der Bildung der Fragmente die elementaren Komponenten der untersten Schachtelungsebene betrachtet. Folgende Teile einer Struktur werden jeweils zu einem Fragment zusammengefasst:
Aufeinander folgende flache zeichenartige Komponenten vom Typ c, n, d, t, zwischen denen keine Ausrichtungslücken liegen, bilden zeichenartige Fragmente.
Aufeinander folgende flache byteartige Komponenten vom Typ x, zwischen denen keine Ausrichtungslücken liegen, bilden byteartige Fragmente.
Aufeinander folgende numerische Komponenten vom Typ i und f, zwischen denen keine Ausrichtungslücken liegen, bilden jeweils eigene Fragmente.
Jede einzelne numerischen Komponente vom Typ p bildet ein eigenes Fragment.
Jede Ausrichtungslücke wird als Fragment betrachtet.
Hinweis
In geschachtelten Strukturen ist zu beachten, dass bei ausgerichteten Unterstrukturen vor und nach den Unterstrukturen Ausrichtungslücken auftreten können.
Beispiel
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
BEGIN OF struc,
a TYPE c LENGTH 3,
b TYPE n LENGTH 4,
c TYPE d,
d TYPE t,
e TYPE f,
f TYPE x LENGTH 2,
g TYPE x LENGTH 4,
h TYPE i,
i TYPE i,
j TYPE i,
k TYPE i,
END OF struc.
- GeSHi ©
Die Struktur struc enthält in einem Unicode-Programm , in dem zeichenartige Felder durch 2 Byte je Zeichen repräsentiert werden, folgende Unicode-Fragmente. Ausrichtungslücken sind mit A bezeichnet.
Fragment Komponenten Bytes
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
1 a, b, c, d 6+8+16+12
2 A 6
3 e 8
4 f, g 2+4
5 A 2
6 h, i, j, k 4+4+4+4
- GeSHi ©
Konvertierungsregeln In Unicode-Programmen gelten folgende Regeln für die Konvertierung einer flachen Struktur in eine andere flache Struktur:
Bei Zuweisungen von Strukturen mit gleicher Fragmentsicht wird die Struktur unkonvertiert zugewiesen.
Bei Zuweisungen von Strukturen unterschiedlicher Länge, deren Fragmentsicht in der Länge der kürzeren Struktur exakt übereinstimmt, erfolgt eine unkonvertierte Zuweisung in der Länge der kürzeren Struktur. Wenn die Zielstruktur länger als die Quellstruktur ist, werden die Komponenten der Zielstruktur, die hinter den gemeinsamen Fragmenten liegen, mit typgerechten Initialwerten gefüllt und Ausrichtungslücken auf hexadezimal 0 gesetzt. Wenn die Zielstruktur kürzer als die Quellstruktur ist, werden die Komponenten der Qellstruktur, die hinter den gemeinsamen Fragmenten liegen, abgeschnitten.
Bei Zuweisungen von Strukturen unterschiedlicher Länge, deren Fragmentsicht bis zum vorletzten Fragment der kürzeren Struktur übereinstimmt und bei denen das nächste Fragment jeweils byte- oder zeichenartig ist, erfolgt eine unkonvertierte Zuweisung des fragmentgleichen Anfangsstücks. Die Zeichen des nächsten Fragments der Quellstruktur werden linksbündig und unkonvertiert dem entsprechenden Fragment der Zielstruktur zugewiesen. Falls dieses Fragment in der Zielstruktur größer als in der Quellstruktur ist, wird je nach Datentyp rechts mit Leerzeichen oder mit hexadezimal 0 aufgefüllt. Falls es kürzer ist, wird rechts abgeschnitten. Die restlichen Komponenten hinter diesem Fragment werden entweder abgeschnitten oder mit typgerechten Initialwerten gefüllt.
Für alle anderen Fälle ist keine Konvertierungsregel definiert und daher keine Zuweisung möglich.
Hinweis Falls ein Syntaxfehler wegen einer unerlaubten Zuweisung zwischen flachen Strukturen auftritt, kann man sich die Fragmentsichten der beteiligten Strukturen durch Auswahl der Drucktaste mit der Informationsikone anzeigen lassen.
Beispiele Eine Zuweisung struc1 = struc2 und umgekehrt ist in Unicode-Programmen nicht erlaubt, weil die Fragmentsicht nicht übereinstimmt (struc1-x belegt im Gegensatz zu struc2-b immer nur ein Byte).
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
BEGIN OF struc1 BEGIN OF struc2,
a(1) TYPE c a(1) TYPE c,
x(1) TYPE x b(1) TYPE c,
END OF struc1. END OF struc2.
- GeSHi ©
Eine Zuweisung struc3 = struc4 und umgekehrt ist zulässig, weil die Fragmentsicht der kürzeren Struktur struc3 mit der Fragmentsicht des Anfangsstücks der längeren Struktur struc4 übereinstimmt.
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
BEGIN OF struc3 BEGIN OF struc4,
a(2) TYPE c a(8) TYPE c,
n(6) TYPE n i TYPE i,
i TYPE i f TYPE f,
END OF struc3. END OF struc4.
- GeSHi ©
Eine Zuweisung struc5 = struc6 und umgekehrt ist wiederum verboten, weil die Fragmentsichten der beiden Strukturen durch die Ausrichtungslücken vor struc5-b und vor struc6-struc0-b nicht übereinstimmen.
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
BEGIN OF struc5 BEGIN OF struc6,
a(1) TYPE x a(1) TYPE x,
b(1) TYPE x BEGIN OF struc0,
c(1) TYPE c b(1) TYPE x,
END OF struc5. c(1) TYPE c,
END OF struc0,
END OF struc6.
- GeSHi ©
Eine Zuweisung struc7 = struc8 und umgekehrt ist möglich, weil die Fragmentsicht bis zum vorletzten Fragment p der kürzeren Struktur struc7 übereinstimmt.
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
BEGIN OF struc7 BEGIN OF struc8,
a TYPE i a TYPE i,
p(8) TYPE p p(8) TYPE p,
c(1) TYPE c c(5) TYPE c,
END OF struc7. o(8) TYPE p,
END OF struc8.
- GeSHi ©