0

たとえば、列挙型があります

type
  TMyEnum = (meOne, meTwo, meThree);

次に、列挙型の値が無限に繰り返されると仮定して、どの列挙型がより大きなスケールに該当するかを判断する関数を作成する必要があります...

function EnumOf(const Value: Integer): TMyEnum;
begin

end;

列挙型のセットが継続的に繰り返される平日のように考えてください。5数値(たとえば、日数)を渡すと、が返されるはずmeTwoです。なぜなら...

1) meOne
2) meTwo
3) meThree
4) meOne
5) meTwo <--
6) meThree

そして、数値7は などを返しmeOneます。

この関数はどのように記述すればよいですか?

4

2 に答える 2

7

mod 演算子を使用します。

function EnumOf(const Value: Integer): TMyEnum; 
begin
  Assert(Value>0);
  Result := TMyEnum((Value-1) mod (1+ord(high(Result))));
end;

Value-1 は、Value の 1 ベースのインデックス付けを、列挙型の 0 ベースのインデックス付けに適合させます。

于 2013-04-07T16:44:02.907 に答える
0

mod次の演算子を使用します。

132 mod 5 = 2

なぜなら

132 = 26*5 + 2
于 2013-04-07T16:43:56.433 に答える