2010-03-09 9 views
9

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.

Répondre

9

Peut-être qu'il est un oubli dans le compilateur, mais il ne compile lorsque les méthodes sont déclarées avant la partie variante. Cela semble une solution raisonnable.

E3Vector3T = packed record 
    public 
     function length: E3FloatT; 
     .. 

     case boolean of 
      true: (
       x: E3FloatT; 
       y: E3FloatT; 
       z: E3FloatT; 
     ); 
      false: (
       elements: packed array[0..2] of E3FloatT; 
     ); 
    end; 
+9

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. –

+0

Depuis les jours Wirth Pascal ... – gabr

+0

@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É –

6

Déplacer la déclaration de fonction au sommet comme celui-ci:

E3Vector3T = packed record 
    public 
     function length: E3FloatT; 
     case boolean of 
      true: (
       x: E3FloatT; 
       y: E3FloatT; 
       z: E3FloatT; 
     ); 
      false: (
       elements: packed array[0..2] of E3FloatT; 
     ); 

    end; 

Cette compile en Delphi 2010.

Questions connexes