У меня есть алгоритм вычисления в Delphi с множеством различных опций, и мне нужно попробовать каждую комбинацию параметров, чтобы найти оптимальное решение.Перечислить возможные значения в Delphi
TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;
Я задавался вопросом об использовании цикла Integer перечислить их:
for EnumerationInteger := 0 to 15 do begin
Options := TMyOptions(EnumerationInteger);
end;
Это не компилируется. Мне было интересно, был ли какой-нибудь довольно простой способ конвертировать из Integer в Set (большинство вопросов в Интернете пытаются пойти другим путем, от Set to Integer), и если да, то что это?
Другая возможность состоит в том, чтобы просто использовать Integer в качестве битового поля:
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
, а затем проверить членство с побитовое и:
if (Options and C_Option2) > 0 then begin
...
end;
Я попытался это, и это работает , но похоже, что работа с наборами будет более естественной и лучше использовать систему типов (даже если я выйду за пределы указанной системы типов, чтобы перечислять множества).
Есть ли лучший/более безопасный способ перечисления всех возможных комбинаций комбинаций, чем перечисление основного целочисленного представления?
Примечание:
- Я знаю, что целые значения набора не гарантируется в теории (хотя я подозреваю, что они на практике, если вы не играете с нумерацией перечисления).
- Может быть более четырех вариантов (да, я знаю, что он растет экспоненциально, и если есть слишком много вариантов, алгоритм может занять вечность).
Это действительно работает. Я предполагаю, что это не сработает для наборов с более чем 8 участниками? (хотя к этому моменту алгоритм, вероятно, уже слишком медленный). –
Сделайте sizeof (SetVar), чтобы узнать, как определенный набор представлен Delphi. –