![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Файл описания:
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 - 17.02.2011 15:58 -------------------- |
volvo |
![]()
Сообщение
#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 в битах |
TarasBer |
![]()
Сообщение
#3
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> TData'Size - это размер TData в битах
То есть дело не в том, что массив байтов забыл упаковаться, он упаковывается сам? Кстати, Table_CRC16 в данном случае считается компилятором или программой при старте? Сообщение отредактировано: TarasBer - 17.02.2011 16:52 -------------------- |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата То есть дело не в том, что массив байтов забыл упаковаться, он упаковывается сам? В данном конкретном случае pragma Pack может отсутствовать, компилятор сам догадается, что надо сделать.Цитата Table_CRC16 это что? CRC16_Table? При старте программы. Еще раз повторяю: constant не гарантирует вычисления на этапе компиляции. Constant гарантирует только иммутабельность (неизменность) объекта. Если для вычисления значения надо вызвать функцию, то это произойдет на этапе запуска программы. Если можно вычислить константу при компиляции - она будет вычислена при компиляции. |
![]() ![]() |
![]() |
Текстовая версия | 24.07.2025 7:45 |