2017-09-07 76 views
8

我不能使用set類型作爲用於陣列的大小的指標,但是這樣做對小套是完全合理的。我可以使用集合類型作爲數組索引嗎?

假設我有以下代碼:

TFutureCoreSet = set of 0..15; 
    TLookupTable = record 
    FData: array[TFutureCoreSet] of TSomeRecord; //error ordinal type required 
    .... 

下面的代碼編譯和作品。

TFutureCoreSet = set of 0..15; 
    TLookupTable = record 
    FData: array[word] of TSomeRecord; 

然而,這打破了國家允許的數量之間的TFutureCoreSet並在查找表中的元素的鏈接。
有沒有簡單的方法來鏈接兩個,所以當一個更改其他更新以及?

+1

你將如何等指標陣列? 'FData [[1,2,4]]:= SomeRecord'?考慮訪問這樣的數組時,所有的組合.. – Victoria

+1

@維多利亞,該集有16位,所以該數組將有64k元素。您只需使用該集的序號值作爲查找值。沒什麼複雜。最多20位,完全可以使用查找表。用'字節集合,這顯然不會工作:-) – Johan

回答

12

只要做到這一點略有不同:

type 
    TFutureCore = 0..15; 
    TFutureCoreSet = set of TFutureCore; 
    TFutureCoreIndex = 0..(2 shl High(TFutureCore)) - 1; 
    TLookupTable = record 
    FData: array[TFutureCoreIndex] of TSomeRecord; 
    end; 

使用TFutureCoreIndex的另一個好處是,你可以用它來強制轉換TFutureCoreSet到有序類型。當強制設置類型時,您必須轉換爲相同大小的序號類型。

AllowedStates = LookupTable.FData[TFutureCoreIndex(FutureCores)]; //works 
AllowedStates = LookupTable.FData[Integer(FutureCores)]; //invalid typecast 
AllowedStates = LookupTable.FData[Word(FutureCores)]; //works, but not type safe. 
+0

我認爲'1 shl ... - 1'是正確的。 1個SHL 16 = 65536,再減去一個:65535 –

+0

@RudyVelthuis,但'高(TFutureCore)'是15和'2 SHL 15'是相同的'1 SHL(15 + 1)'。 –

+0

是的,這也將解決您只能將一組設置爲具有完全相同大小的整數類型的事實。順便說一句,「高(TFutureCore)」不會更清潔,或者我錯過了什麼。 – Johan

相關問題