2010-03-09 10 views
9

Tengo el siguiente definición de registro¿Cuál es la sintaxis para incluir métodos en un registro de variantes?

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; 

Lo que quería hacer es introducir una parte récord variante para poder acceder a los tres elementos de forma individual y como una matriz, es decir

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; 

Este no se compilará (la función necesita un tipo de resultado en la longitud de la función). ¿Algo obvio que estoy haciendo mal, o esto no es compatible? En ese caso, ¿hay alguna sugerencia para una forma elegante pero efectiva de acceder a los campos individuales como una matriz?

p.s. E3FloatT es un alias de tipo simple para Single.

Respuesta

9

tal vez es un descuido en el compilador, pero se compila cuando se declaran los métodos antes la parte variante. Esta parece una solución razonable.

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

No es un descuido. Al igual que siempre, la parte variante de un registro de variante * debe * siempre ser declarada como la última. –

+0

Desde los días de Wirth Pascal ... – gabr

+0

@ Allen: ... por supuesto, ¡gracias! Siempre pensé que esa regla particular estaba allí para hacer que el acceso a los datos fuera más directo, nunca se me ocurrió que existía por razones gramaticales. :RE –

6

Mover la declaración de función en la parte superior de esta manera:

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; 

Esto compila en Delphi 2010.

Cuestiones relacionadas