У меня есть два типа и два массива, что типы в file.adsИзменить тип массива: тип 8bit к типу 6bit
type Ebit is mod 2**8;
type Sbit is mod 2**6;
type Data_Type is array (Positive range <>) of Ebit;
type Changed_Data_Type is array (Positive range <>) of Sbit;
и функции:
function ChangeDataType (D : in Data_Type) return Changed_Data_Type
with
Pre => D'Length rem 3 = 0 and D'Last < Positive'Last/4,
Post => ChangeDataType'Result'Length = 4 * (D'Length/3)
Ok я могу понять все это , Например, у нас есть следующие единицы:
65, 66, 65, 65, 66, 65 в 8-значных значениях функции должны давать нам 16, 20, 9, 1, 16, 20, 9, 1 в 6 бит значениях.
Я не знаю, как я могу построить 6-битную таблицу из 8-битной таблицы.
Моя идея sollutions является, например, принимая по кусочкам от типа:
fill all bites in 6bit type to 0 (propably default)
if first bit (2**1) is 1 set bit (2**1) in 6bit type to 1;
and do some iterations
Но я не знаю, как это сделать, всегда есть проблема с типами. Является ли эта хорошая идея, или я могу сделать это проще? Я трачу последний нигт, чтобы попытаться написать это, но безуспешно.
Редактировать: Я написал код, его работа, но у меня проблема с инициализацией массива.
function ChangeDataType (D: in Data_Type) return Changed_Data_Type
is
length: Natural := (4*(D'Length/3));
ER: Changed_Data_type(length);
Temp: Ebit;
Temp1: Ebit;
Temp2: Ebit;
Actual: Ebit;
n: Natural;
k: Natural;
begin
n := 0;
k := 0;
Temp := 2#00000000#;
Temp1 := 2#00000000#;
Temp2 := 2#00000000#;
Array_loop:
for k in D'Range loop
case n is
when 0 =>
Actual := D(k);
Temp1 := Actual/2**2;
ER(k) := Sbit(Temp1);
Temp := Actual * (2**4);
n := 2;
when 2 =>
Actual := D(k);
Temp1 := Actual/2**4;
Temp2 := Temp1 or Temp;
ER(k) := Sbit(Temp2);
Temp := Actual * (2**2);
n := 4;
when 4 =>
Actual := D(k);
Temp1 := Actual/2**6;
Temp2 := Temp1 or Temp;
ER(k) := Sbit(Temp2);
n := 6;
when 6 =>
Temp1 := Actual * (2**2);
Temp2 := Actual/2**2;
ER(k) := Sbit(Temp2);
n := 0;
when others =>
n := 0;
end case;
end loop Array_Loop;
return ER;
end;
'' '' и '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Если вам нужна смена, вы можете умножить или разделить на мощность 2. – ajb
Thx для ответа. Когда я пытаюсь установить значение 6 бит с 8 бит с помощью побитового оператора, я всегда получаю «ожидаемый тип 8 бит» от ADA. Можете ли вы дать мне один пример, как настроить 6-битное значение? – CryptoNewbie
2 ошибки в опубликованном коде: 'length: Natural: = (4 * ((D'Length + 2)/3));' обязательно, чтобы избежать ошибки «вне игры», когда Length mod 3/= 0 .. и 'ER: Changed_Data_type (1 .. length);' ie подтип_марка точно, как указано в сообщении об ошибке. Кроме того, если вы получите упакованный массив ниже для работы, вы устраните весь цикл и регистр case ... –