Tengo un algoritmo de cálculo en Delphi con varias opciones diferentes, y tengo que probar cada combinación de opciones para encontrar una solución óptima.Enumerar posibles valores establecidos en Delphi
TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;
me preguntaba sobre el uso de un bucle de entero a enumerarlos:
for EnumerationInteger := 0 to 15 do begin
Options := TMyOptions(EnumerationInteger);
end;
Esto no compila. Lo que me preguntaba era si había algún método bastante simple para convertir de Integer a Set (la mayoría de las preguntas en la Web intentan ir para el otro lado, de Set a Integer), y si es así, ¿qué es?
Otra posibilidad es usar el entero como un campo de bits:
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
y luego membresía de prueba con un nivel de bits y:
if (Options and C_Option2) > 0 then begin
...
end;
He intentado esto, y funciona , pero parece que trabajar con conjuntos sería más natural y usar mejor el sistema de tipos (aunque salgo fuera del sistema de tipo mencionado para enumerar los conjuntos).
¿Existe una manera mejor/más segura de enumerar todas las combinaciones de conjuntos posibles que enumerar la representación entera subyacente?
Notas:
- sé que los valores enteros de un conjunto no están garantizados en la teoría (aunque sospecho que son en la práctica si no se juega con la numeración de enumeración).
- Podría haber más de cuatro opciones (sí, sé que crece exponencialmente y si hay demasiadas opciones, el algoritmo podría tardar una eternidad).
que en realidad funciona. ¿Asumo que no funcionaría para conjuntos con más de 8 miembros? (aunque en ese momento el algoritmo probablemente ya sea demasiado lento). –
Haz sizeof (SetVar) para descubrir cómo un conjunto particular está representado por Delphi. –