2017-09-07 7 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 요소가 있습니다. 조회 값으로 집합의 서수 값을 사용하기 만하면됩니다. 복잡한 것은 없습니다. lookuptable을 사용하려면 최대 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을 타입 변환하는 데 사용할 수 있다는 것입니다. 집합 유형을 유형 변환 할 때 같은 크기의 서수 유형으로 변환해야합니다.

+0

''1 shl ... - 1'이 맞다고 생각합니다. 1 shl 16 = 65536, 1 빼기 : 65535. –

+0

@RudyVelthu이지만 'High (TFutureCore)'는 15이고'2 shl 15 '는'1 shl (15 + 1)'과 같습니다. –

+0

예, 이것은 동일한 크기의 정수형으로 만 집합을 캐스팅 할 수 있다는 사실도 수정합니다. BTW는'0..1 shl High (TFutureCore)'가 더 깔끔하지 않거나 뭔가 놓쳤습니다. – Johan