質問

私は、次のレコード定義を持っている。

  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;

私は何をしたかったのは、3つの要素の両方を個別および配列、すなわちなどにアクセスできるように変種記録部を導入されています。

  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;

これはコンパイルされません(関数は、関数の長さで、結果の型を必要とします)。明白なものは、私が間違ってやっている、またはこれはサポートされていませんか?その場合、配列として個々のフィールドにアクセスするためのエレガントでありながらパフォーマンスの道のための任意の提案ですか?

p.s。 E3FloatTはシングルのためのシンプルなタイプの別名である。

役に立ちましたか?

解決

多分それは、コンパイラでは見落としているが、それはメソッドがバリアントの一部の前に宣言されたときにコンパイルしません。これは、合理的な解決策を思わます。

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;

他のヒント

このようなトップに関数宣言を移動

  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;

このは、Delphi 2010でコンパイルします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top