문제

다음과 같은 기록 정의가 있습니다

  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;

내가하고 싶은 것은 개별적으로 그리고 배열로 세 가지 요소에 액세스 할 수있는 변형 레코드 부분을 소개하는 것입니다.

  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는 단일에 대한 간단한 유형 별칭입니다.

도움이 되었습니까?

해결책

어쩌면 컴파일러의 감독 일지 모르지만 변형 부분 전에 메소드가 선언 될 때 컴파일됩니다. 이것은 합리적인 솔루션으로 보입니다.

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;

이것은 델파이 2010에서 컴파일됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top