2017-09-07 6 views
8

Je ne peux pas utiliser un type set en tant qu'indicateur de taille pour un tableau, mais il est parfaitement judicieux de le faire pour les petits ensembles.Puis-je utiliser un type set en tant qu'index de tableau?

Supposons que j'ai le code suivant:

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

Le code suivant compile et travaux.

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

Ce casse cependant le lien entre le nombre autorisé d'états dans TFutureCoreSet et les éléments de la table de consultation.
Existe-t-il un moyen simple de lier les deux alors quand on change les autres mises à jour?

+1

Comment indexeriez-vous un tel tableau? 'FData [[1, 2, 4]]: = SomeRecord'? Pensez à toutes les combinaisons en accédant à un tel tableau. – Victoria

+1

@Victoria, L'ensemble a 16 bits, donc le tableau aura 64k éléments. Vous utilisez simplement la valeur ordinale de l'ensemble comme valeur de recherche. Rien de compliqué. Jusqu'à 20 bits, il est parfaitement faisable d'utiliser un lookuptable. Avec 'set of byte' cela ne marchera évidemment pas :-) – Johan

Répondre

12

Il suffit de le faire un peu différemment:

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

L'autre avantage d'utiliser un TFutureCoreIndex est que vous pouvez l'utiliser pour typer TFutureCoreSet à un type ordinal. Lors du typage d'un type de set, vous devez convertir un type ordinal de la même taille.

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

Je pense que' 1 shl ... - 1' est correct. 1 shl 16 = 65536, moins un: 65535. –

+0

@RudyVelthuis, mais 'High (TFutureCore)' est 15 et '2 shl 15' est identique à' 1 shl (15 + 1) '. –

+0

Oui, cela corrigera également le fait que vous pouvez uniquement convertir un ensemble en un type entier avec exactement la même taille. BTW would '0..1 shl High (TFutureCore)' ne pas être plus propre, ou ai-je raté quelque chose. – Johan