2017-09-07 64 views
8

Tôi không thể sử dụng loại set làm chỉ báo kích thước cho một mảng, tuy nhiên làm như vậy cho các bộ nhỏ là hoàn toàn hợp lý.Tôi có thể sử dụng loại thiết lập làm chỉ mục mảng không?

Giả sử tôi có đoạn mã sau:

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

Các mã sau biên dịch và các công trình.

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

Tuy nhiên, ngắt liên kết giữa số trạng thái cho phép trong TFutureCoreSet và các yếu tố trong bảng tra cứu.
Có cách nào đơn giản để liên kết cả hai để khi một thay đổi các bản cập nhật khác?

+1

Bạn sẽ lập chỉ mục mảng như thế nào? 'FData [[1, 2, 4]]: = SomeRecord'? Hãy suy nghĩ về tất cả các kết hợp khi truy cập mảng đó .. – Victoria

+1

@Victoria, Tập hợp có 16 bit, do đó mảng sẽ có các phần tử 64k. Bạn chỉ cần sử dụng giá trị thứ tự của tập hợp làm giá trị tra cứu. Không có gì phức tạp cả. Lên đến 20 bit hoàn toàn khả thi của nó để sử dụng một lookuptable. Với 'bộ byte' rõ ràng sẽ không hoạt động :-) – Johan

Trả lời

12

Chỉ cần làm điều đó hơi khác nhau:

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

Một thuận lợi khác của việc sử dụng một TFutureCoreIndex là bạn có thể sử dụng nó để định kiểu TFutureCoreSet để một kiểu thứ tự. Khi typecasting một loại thiết lập, bạn phải đúc một loại thứ tự có cùng kích thước.

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

Tôi nghĩ rằng' 1 shl ... - 1' là chính xác. 1 shl 16 = 65536, trừ một: 65535. –

+0

@RudyVelthuis, nhưng 'Cao (TFutureCore)' là 15 và '2 shl 15' giống với' 1 shl (15 + 1) '. –

+0

Có, điều này cũng sẽ khắc phục sự thật rằng bạn chỉ có thể truyền một tập hợp thành một loại số nguyên có cùng kích thước. BTW sẽ '0..1 shl cao (TFutureCore)' không được sạch hơn, hoặc tôi đã bỏ lỡ một cái gì đó. – Johan

Các vấn đề liên quan