2017-09-07 96 views
8

Nie mogę użyć typu set jako wskaźnika rozmiaru tablicy, jednak w przypadku małych zestawów jest to całkowicie sensowne.Czy mogę użyć typu zestawu jako indeksu tablicy?

Załóżmy, że mam następujący kod:

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

Poniższy kod kompiluje i działa.

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

To jednak zrywa związek pomiędzy dozwolonej liczby państw w TFutureCoreSet i elementy w tabeli.
Czy istnieje prosty sposób na połączenie tych dwóch elementów, aby zmienić także inne aktualizacje?

+1

Jak zindeksować taką tablicę? 'FData [[1, 2, 4]]: = SomeRecord'? Pomyśl o wszystkich kombinacjach podczas uzyskiwania dostępu do takiej tablicy .. – Victoria

+1

@Victoria, Zestaw ma 16 bitów, więc tablica będzie miała 64k elementów. Po prostu użyj wartości porządkowej zestawu jako wartości odnośnika. Nic skomplikowanego. Do 20 bitów doskonale nadaje się do użytku z wyglądem. Z 'zestawem bajtów', który oczywiście nie zadziała :-) – Johan

Odpowiedz

12

Wystarczy zrobić to nieco inaczej:

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

Inną zaletą korzystania z TFutureCoreIndex jest to, że można go używać do typecast TFutureCoreSet do typu porządkowej. Podczas typowania zbioru typu należy rzutować na typ porządkowy tego samego rozmiaru.

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

Myślę, że' 1 shl ... - 1' jest poprawne. 1 shl 16 = 65536, minus jeden: 65535. –

+0

@RudyVelthuis, ale 'High (TFutureCore)' to 15, a '2 shl 15' to to samo co' 1 shl (15 + 1) '. –

+0

Tak, to również naprawi fakt, że możesz rzucić zestaw tylko do typu całkowitego o dokładnie tym samym rozmiarze. BTW miałoby '0,1 shl High (TFutureCore)' nie byłoby czystsze, czy też coś przeoczyłem. – Johan