Domanda

Ho la seguente definizione del record

  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;

Quello che ho voluto fare è introdurre una parte disco variante per poter accedere alle tre elementi sia individualmente che come una matrice, cioè.

  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;

Questo non verrà compilato ( funzione richiede un tipo di risultato a lungo funzione). Tutto ciò che ovvio che sto facendo male, o è questo non è supportato? In tal caso, qualche suggerimento per un modo elegante e performante di accedere ai singoli campi come un array?

P.S. E3FloatT è un tipo semplice alias per singola.

È stato utile?

Soluzione

Forse è una svista nel compilatore, ma lo fa compilare qualora i metodi siano dichiarate prima parte variante. Questo sembra una soluzione ragionevole.

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;

Altri suggerimenti

Spostare la dichiarazione di funzione verso l'alto in questo modo:

  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;

Questa compila in Delphi 2010.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top