2017-12-07 7 views
-1

パスカルをよく知っている人の助けが必要です。パスカルバリアントレコードの使用

私はバリアントレコードを使用するために(教師の必要条件が)必要です。これらのバリアントレコードは、次のように定義されています。

Temperature = record 
    case scale : TemperatureScale of 
    celsius : (celsius_value : ScaleCelsius); 
    kelvin : (kelvin_value : ScaleKelvin); 
end; 

私はこのトピックに関する私の研究中に発見された一次資料によると、私はそれを宣言するだけでどのように、バリアントレコードを使用する方法を見つけることができませんでした。

私の主な情報源:Google検索(見つかっ何も)、Case-FreepascalRecord-Freepascal

編集私は実装で使用しなければならないのだろうか人のために、それはexaclyこれです:

type 
    UkPolozka = ^Polozka; 
    UkHodnota = ^Hodnota; 
    TypUdaj=(typretez, typcele, typrealne, typlogik, typpole, typobjekt); 

    VarZaznam = record 
    case Udaj: TypUdaj of   
    typretez: (retez: string); 
    typcele: (cele: word); 
    typrealne: (realne: single); 
    typlogik: (logik: boolean); 
    typpole: (pole: UkHodnota); 
    typobjekt: (objekt: UkPolozka); 
end; 

Polozka = record 
    Nazev: string; 
    Hodn: VarZaznam; 
    Dalsi: UkPolozka 
end; 
Hodnota = record 
    Hodn: VarZaznam; 
    Dalsi: UkHodnota  
end; 
+0

あなたは、特定の問題を説明していません。有用なバリアントレコードの例としてhttps://www.freepascal.org/docs-html/rtl/sysutils/longrec.htmlを考えてみましょう – MBo

+0

レコードフィールド 'scale'が' celsius'の場合、バリアントパーツには 'celsius_value'が含まれています。それが 'kelvin'の場合、変形部分は' kelvin_value'を含みます。バリアントパーツは、バリアントデスクリプタに応じて複数の解釈のための空間を共有します。バリアント記述子は、型としてのみ指定することもできます。 'case boolean of'です。 –

+0

@mboレコードのフィギュアタイプは?どのようにそれから読む? – gussPepe

答えて

0

Delphi Helpから例のレコードを考えてみましょう。私はタグでそれを修正しました。

タグの使用はオプションで、通常は使用されず、有用な情報を提供しません。
最初の行は、heightと同じ値の半径を出力します。これらは同じメモリを共有します。

は、その後、私は明示的にタグを設定する(ただし、フィールドは同じまま)

はまた、無タグレコードのサイズの違いに注意し、1をタグ付け。

また、ほとんどの場合、プログラマはタグ値を定義したり使用したりしません。タグに頼るのは危険です(タグを割り当てる際に厳格なルールを守るまで)。私はrectangleタグを設定しませんでしたが、プログラムはゼロタグを最初の変種と見なします。

必要なフィールドを名前で割り当てるだけです。必要なフィールドを名前で読むだけです。あなたたとえば、DelphiでvarVarZaznam.retez:= 'test';

type 
    TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other); 
    TFigure = record 
    case shape: TShapeList of 
     Rectangle: (Height, Width: Real); 
     Triangle: (Side1, Side2, Angle: Real); 
     Circle: (Radius: Real); 
     Ellipse, Other:(); 
    end; 

    TFigureNoTag = record 
    case TShapeList of 
     Rectangle: (Height, Width: Real); 
     Triangle: (Side1, Side2, Angle: Real); 
     Circle: (Radius: Real); 
     Ellipse, Other:(); 
    end; 

var 
    Fig: TFigure; 
begin 
    Fig.Height := 5; 
    Fig.Width := 3; 
    //default tag is zero = Rectangle 
    if Fig.shape = Rectangle then 
    Writeln('Rect ', Fig.Height:3:0, Fig.Width:3:0, Fig.Radius:3:0) 
    else 
    Writeln('not Rect'); 

    Fig.shape := Circle; 
    if Fig.shape <> Rectangle then 
    Writeln('not Rect'); 

    Writeln('Fig size ', SizeOf(TFigure), ' noTag size ', SizeOf(TFigureNoTag)); 
    Readln; 

出力:

Rect 5 3 5 
not Rect 
Fig size 32 noTag size 24 
+0

これはpreatty良い例に見えます...また、私はおそらくタグを設定する必要があります1つの大きなダイナミックな構造(教師の必要条件)でメモリに保存し、それを使って...また、私はタグを設定する方法を知る必要があります – gussPepe

+0

タグは単なるフィールドです。レコードの他のフィールドと同様に設定します。 –

+0

私の例は、タグ設定 'Fig.shape:= Circle;'を含んでいます。 – MBo