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 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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