Ich habe die folgende DatensatzdefinitionWie lautet die Syntax zum Einschließen von Methoden in einen Variantensatz?
E3Vector3T = packed record
public
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
function length: E3FloatT;
function normalize: E3Vector3T;
function crossProduct(const aVector: E3Vector3T): E3Vector3T;
class operator add(const aVector1, aVector2: E3Vector3T): E3Vector3T;
class operator subtract(const aVector1, aVector2: E3Vector3T): E3Vector3T;
class operator negative(const aVector: E3Vector3T): E3Vector3T;
class operator multiply(const aVector: E3Vector3T; const aScalar: E3FloatT): E3Vector3T;
class operator divide(const aVector: E3Vector3T; const aScalar: E3FloatT): E3Vector3T;
end;
Was ich tun wollte, ist eine Variante Rekord Teil einzuführen, um die drei Elemente zugreifen können sowohl einzeln als auch als Array, dh
E3Vector3T = packed record
public
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
function length: E3FloatT;
..
end;
Diese wird nicht kompiliert ( Funktion benötigt einen Ergebnistyp bei Funktionslänge). Alles offensichtlich, was ich falsch mache, oder wird das nicht unterstützt? In diesem Fall Vorschläge für eine elegante und doch performante Art, auf die einzelnen Felder als Array zuzugreifen?
p.s. E3FloatT ist ein einfacher Typalias für Single.
Es ist kein Versehen. So wie es immer war, muss der Variantenteil eines Variantensatzes * immer als letzter deklariert werden. –
Seit den Wirth Pascal Tagen ... – gabr
@Allen: ... natürlich, danke! Ich dachte immer, dass eine bestimmte Regel da war, um den Datenzugriff einfacher zu machen, es kam mir nie vor, dass es aus grammatikalischen Gründen existierte. : D –