Ho un algoritmo di calcolo in Delphi con un numero di opzioni diverse, e ho bisogno di provare ogni combinazione di opzioni per trovare una soluzione ottimale.Enumera i valori impostati possibili in Delphi
TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;
mi chiesi sull'utilizzo di un ciclo intero di enumerarli:
for EnumerationInteger := 0 to 15 do begin
Options := TMyOptions(EnumerationInteger);
end;
Questo non può essere compilato. Quello che mi chiedevo era se esistesse un metodo abbastanza semplice per convertire da Integer a Set (la maggior parte delle domande sul Web provano ad andare dall'altra parte, da Set a Integer) e, in caso affermativo, di cosa si tratta?
Un'altra possibilità è quella di utilizzare solo l'intero come un campo di bit: l'adesione
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
e poi prova con un bit a bit e:
if (Options and C_Option2) > 0 then begin
...
end;
Ho provato questo, e funziona , ma sembra che lavorare con gli insiemi sia più naturale e utilizzare meglio il sistema dei tipi (anche se sto andando fuori dal suddetto sistema di tipi per enumerare gli insiemi).
Esiste un modo migliore/più sicuro per enumerare tutte le possibili combinazioni di set rispetto all'enumerazione della rappresentazione intera sottostante?
Note:
- so che i valori interi di un insieme non sono garantiti in teoria (anche se ho il sospetto che siano in pratica se non si gioca con la numerazione di enumerazione).
- Ci potrebbero essere più di quattro opzioni (sì, lo so che cresce in modo esponenziale e se ci sono troppe opzioni che l'algoritmo potrebbe richiedere per sempre).
che effettivamente funziona. Presumo che non funzionerebbe per i set con più di 8 membri? (anche se a quel punto l'algoritmo è probabilmente già troppo lento). –
Do sizeof (SetVar) per scoprire come un particolare set è rappresentato da Delphi. –