Pregunta

Tengo la siguiente definición de registro

  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 variante registro 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;

Esto no se compilará ( función necesita un tipo de resultado a longitud de función). Cualquier cosa obvia que estoy haciendo mal, o se trata no es compatible? En ese caso, cualquier sugerencia de una manera elegante y performant de acceder a los campos individuales como una matriz?

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

¿Fue útil?

Solución

Tal vez es un descuido en el compilador, pero sí compilar cuando se declaran los métodos antes de la parte variante. Esto 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;

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top