9

次のレコード定義があります

  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;

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

ps E3FloatT は、Single の単純な型エイリアスです。

4

2 に答える 2

9

コンパイラの見落としかもしれませんが、バリアント部分の前にメソッドが宣言されている場合はコンパイルされます。これは合理的な解決策のようです。

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;
于 2010-03-09T21:24:31.553 に答える
6

次のように、関数宣言を一番上に移動します。

  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 でコンパイルされます。

于 2010-03-09T21:18:54.250 に答える