IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Написание модуля для расчёта CRC16, АДА
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Файл описания:

package CRC16 is

type m16 is mod 2**16;

generic
type TData is private;
function Get_CRC16(Data: TData) return m16;

end CRC16;


Файл реализации:

with ADA.Unchecked_Conversion;

package body CRC16 is

type m8 is mod 2**8;
type TTable is array (m8) of m16;

function Get_Table return TTable is
Result: TTable;
r: m16;
begin
for i in Result'Range loop
r := m16(i);
if (r and 1) = 1 then
r := r/2 xor 16#A001#; --???
else
r := r/2; -- ???
end if;
Result(i) := r;
end loop;
return Result;
end;

CRC16_Table: constant TTable := Get_Table;

function Get_CRC16(Data: TData) return m16 is
type m8_arr is array (1 .. TData'Size) of m8;
pragma Pack(m8_arr);
function Data_To_Arr is new Ada.Unchecked_Conversion(TData, m8_arr); --???
use type m8;

Result: m16;
p: m8_arr := Data_To_Arr(Data);
begin
Result := 16#FFFF#;
for i in p'Range loop
Result := (Result / 2**8) xor CRC16_Table(m8(Result and 16#FF#) xor p(i)); --???
end loop;
return Result;
end;

end CRC16;


Проблемы:
1. Как делать битовые сдвиги? Деление на степень двойки это как-то неправильно в данном случае.
2. m8Arr по размеру никак не хочет совпадать с TData

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Как делать битовые сдвиги? Деление на степень двойки это как-то неправильно в данном случае.
Битовые сдвиги реализуются не операторами, а функциями. В пакете Interfaces есть:

   function Shift_Left  (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Shift_Right (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Shift_Right_Arithmetic (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Rotate_Left (Value : Unsigned_n; Amount : Natural) return Unsigned_n;
function Rotate_Right (Value : Unsigned_n; Amount : Natural) return Unsigned_n;


Цитата
m8Arr по размеру никак не хочет совпадать с TData
TData'Size - это размер TData в битах
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> TData'Size - это размер TData в битах

То есть дело не в том, что массив байтов забыл упаковаться, он упаковывается сам?

Кстати, Table_CRC16 в данном случае считается компилятором или программой при старте?

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
То есть дело не в том, что массив байтов забыл упаковаться, он упаковывается сам?
В данном конкретном случае pragma Pack может отсутствовать, компилятор сам догадается, что надо сделать.

Цитата
Table_CRC16
это что? CRC16_Table? При старте программы. Еще раз повторяю: constant не гарантирует вычисления на этапе компиляции. Constant гарантирует только иммутабельность (неизменность) объекта. Если для вычисления значения надо вызвать функцию, то это произойдет на этапе запуска программы. Если можно вычислить константу при компиляции - она будет вычислена при компиляции.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.05.2024 23:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name