2017-09-07 64 views
8

Bir dizi için boyut göstergesi olarak set türünü kullanamıyorum, ancak küçük gruplar için bunu yapmak kesinlikle mantıklıdır.Dizi türünü dizi dizini olarak kullanabilir miyim?

varsayalım Aşağıdaki kod var:

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

Aşağıdaki kod derler ve eserleri.

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

Ancak bu TFutureCoreSet devletlerin izin sayısı arasındaki bağlantıyı ve arama tablosundaki unsurları kırar.
Biri diğer güncellemeleri de değiştirdiğinde, bu ikisi arasında bağlantı kurmanın basit bir yolu var mı?

+1

Bu diziyi nasıl dizine eklersiniz? 'FData [[1, 2, 4]]: = SomeRecord'? Böyle bir diziye erişirken tüm kombinasyonları düşünün .. – Victoria

+1

@Victoria, Set 16 bite sahiptir, bu yüzden dizinin 64k öğeleri olacaktır. Sadece setin sıralama değerini arama değeri olarak kullanırsınız. Karmaşık bir şey yok. 20 bite kadar mükemmel bir şekilde arama yapılabilir. Açıkça işe yaramayacak bir bayt kümesiyle :-) – Johan

cevap

12

Sadece biraz farklı bir şekilde yapın:

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

bir TFutureCoreIndex kullanmanın diğer bir avantajı, bir sıra tipine TFutureCoreSet typecasting için kullanabilirsiniz olmasıdır. Bir set tipini yazarken, aynı büyüklükte bir ordinal tipte yayınlamanız gerekir.

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

Bence 1 shl ... - 1 'doğru. 1 shl 16 = 65536, eksi bir: 65535. –

+0

@RudyVelthuis, ancak 'High (TFutureCore)' 15 ve '2 shl 15'' 1'li (15 + 1)' ile aynıdır. –

+0

Evet, bu, aynı seti yalnızca tam olarak bir tamsayı türüne atayabileceğiniz gerçeği düzeltecektir. BTW 0..1 shl Yüksek (TFutureCore) 'daha temiz olamazdı, ya da bir şey özledim. – Johan