2010-03-09 4 views
9

Ich habe die folgende DatensatzdefinitionWie lautet die Syntax zum Einschließen von Methoden in einen Variantensatz?

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; 

Was ich tun wollte, ist eine Variante Rekord Teil einzuführen, um die drei Elemente zugreifen können sowohl einzeln als auch als Array, dh

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; 

Diese wird nicht kompiliert ( Funktion benötigt einen Ergebnistyp bei Funktionslänge). Alles offensichtlich, was ich falsch mache, oder wird das nicht unterstützt? In diesem Fall Vorschläge für eine elegante und doch performante Art, auf die einzelnen Felder als Array zuzugreifen?

p.s. E3FloatT ist ein einfacher Typalias für Single.

Antwort

9

Vielleicht ist es ein Versehen in den Compiler, aber es läßt sich, wenn die Verfahren vor deklariert werden der variante Teil. Dies scheint eine vernünftige Lösung zu sein.

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; 
+9

Es ist kein Versehen. So wie es immer war, muss der Variantenteil eines Variantensatzes * immer als letzter deklariert werden. –

+0

Seit den Wirth Pascal Tagen ... – gabr

+0

@Allen: ... natürlich, danke! Ich dachte immer, dass eine bestimmte Regel da war, um den Datenzugriff einfacher zu machen, es kam mir nie vor, dass es aus grammatikalischen Gründen existierte. : D –

6

die Funktionsdeklaration nach oben wie folgt verschieben:

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; 

Dies kompiliert in Delphi 2010.

Verwandte Themen