J'ai la définition d'enregistrement suivantQuelle est la syntaxe pour inclure des méthodes dans un enregistrement de variante?
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;
Ce que je voulais faire est d'introduire une partie d'enregistrement variant de pouvoir accéder aux trois éléments à la fois individuellement et en tant que tableau, à savoir
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;
Cette ne compilera pas (la fonction nécessite un type de résultat à la longueur de la fonction). Quelque chose d'évident que je fais mal, ou n'est-ce pas supporté? Dans ce cas, des suggestions pour une manière élégante mais performante d'accéder aux champs individuels en tant que tableau?
p.s. E3FloatT est un alias de type simple pour Single.
Ce n'est pas un oubli. Tout comme il l'a toujours été, la variante d'un enregistrement variant * doit toujours être déclarée en dernier. –
Depuis les jours Wirth Pascal ... – gabr
@Allen: ... bien sûr, merci! J'ai toujours pensé que cette règle particulière était là pour rendre l'accès aux données plus direct, il ne m'est jamais venu à l'esprit pour des raisons grammaticales. :RÉ –