Однако вы можете использовать Unchecked_Conversion, если вы конвертируете, скажем, из модульного целочисленного типа в битовый массив.Я обычно избегаю использования Unchecked_Conversion, если не в крайнем случае, но я вижу искушение преобразовать целочисленный тип в битовый массив.Тем не менее, я бы также подумал, стоит ли просто использовать модульное целое число, поскольку его можно использовать и для побитовых операций.Однако использование синтаксиса массива для доступа к битам - хорошая функция.Даже если бы я захотел преобразовать модульное целое число в битовый массив, я все равно рекомендовал бы по возможности избегать использования Unchecked_Conversion или значительной части Unchecked_ что-либо в Ada.Одна из причин заключается в том, что Unchecked_Conversion, вероятно, будет менее переносимым.Например, разные компиляторы и разные цели могут хранить биты в разных порядках.
Еще одно предложение - использовать упакованный массив логических выражений, а не упакованный массив битов.Память в памяти должна выглядеть одинаково, но я думаю, что вам будет удобнее работать с логическими значениями, а не с битами.Это избавляет вас от необходимости сравнивать значения с 1 или 0.
Таким образом, один из способов преобразования ваших входных строк в модульное целое число - это использование пакета Ada.Text_IO.Modular_IO.
type Short is mod 2**16;
package Short_IO is new Modular_IO (Num => Short);
type Bit_Array is array (Positive range <>) of Boolean
with Component_Size => 1;
...
declare
Input : constant String := Get_Line;
Value : Short := 0;
Last : Positive;
Bits_11 : Bit11;
-- Instead of using Unchecked_Conversion, consider writing a
-- simple conversion function
--
function To_Bit11 (Value : Short) return Bit11 is
((for I in Bit11'Range => (Short(2**(I-1)) and Value) /= 0));
begin
-- Enclosing the input string with 2#{binary_string}#,
-- causes the number to be read in base 2, as a binary text
-- string.
Short_IO.Get (From => "2#" & Input & "#",
Item => Value,
Last => Last);
-- You could use unchecked conversion here to convert
-- to the Bit array, but I'd recommend doing this
-- without using unchecked features of the language
-- e.g. using a simple loop
for I in Bits_11'Range loop
Bits_11 (I) := (Short(2**(I-1)) and Value) /= 0;
end loop;
-- or you can even try an Ada 2020 feature that already has
-- been implemented in the latest community edition of GNAT.
-- By assigning a new form of array aggregate to the
-- bit array object. You'd need to set the -gnatX compiler
-- option to tell the compiler to use Ada extended 2020
-- features. Many Ada 2020 features are not yet available to try
-- out, but this one is available.
Bits_11 :=
(for I in Bits_11'Range => (Short (2**(I-1)) and Value) /= 0);
-- or combine this into an expression function like above,
-- then you have a function similar to the one you'd get using
-- Unchecked_Conversion, except more portable, and one can
-- examine the code to understand the implementation.
Bits_11 := To_Bit11 (Value);