Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2021, 06:44   #61
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы пока не исправили ошибку со "скачущим" begin (но это влияет на неверность расчета, но не на компилируемость). Скопировал ваш код как есть и не получил ошибок. Значит ошибка закралась в вызов функции CRC16CCITT.
скачущая begin . вот так надо?
Код:
 function CRC16(P: PChar; Len: Word; 
 skip_i : Integer;  Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;


  for i := 0 to Len - 1 do
  if i = skip_i then
continue;

if RefIn then
      Result := Result xor reverse(ord(P[i]))
    else
      Result := Result xor (ord(P[i]) shl 8);
    for j := 0 to 7 do
    begin
      if (Result and $8000) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result);
  Result := Result xor XorOut;
end;
Цитата:
Сообщение от BDA Посмотреть сообщение
Значит ошибка закралась в вызов функции CRC16CCITT.
А где тут ошибка может закрасться ?
Код:
 function CRC16CCITT(P: PChar; Len: Word; skip_i: Integer): Word;
begin
  Result := CRC16(P, Len, skip_i ,  $1021, $FFFF, 0, False, False);
end;

Последний раз редактировалось BDA; 19.11.2021 в 18:50.
sergey.serg-72 вне форума Ответить с цитированием
Старый 16.11.2021, 07:07   #62
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,321
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
вот так надо?
А теперь begin не хватает. А его нужно поставить между for и if с проверкой skip_i. Вы будто в морской бой играете, а не код пишете.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А где тут ошибка может закрасться ?
Это описание функции, а не её вызов. Компилятор также указывает строку кода, которая ему не нравится. Какая именно строка его смущает?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.11.2021, 07:09   #63
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вы пока не исправили ошибку со "скачущим" begin
Покажите пожалуйста. где этот begin. прям в код тыкнете мне. не пойму я ни как.

Цитата:
Сообщение от BDA Посмотреть сообщение
А теперь begin не хватает. А его нужно поставить между for и if с проверкой skip_i. Вы будто в морской бой играете, а не код пишете.
Точно ведь. башка уже не соображает. на простом валюсь, исправил
Код:
for i := 0 to Len - 1 do
 begin
  if i = skip_i then
continue;
Цитата:
Сообщение от BDA Посмотреть сообщение
Это описание функции, а не её вызов. Компилятор также указывает строку кода, которая ему не нравится. Какая именно строка его смущает?
Вот. наконец то . компилируется отлично первая проверка отлично. проверьте финишный полный код :
Код:
function CRC16(P: PChar; Len: Word;
 skip_i : Integer;  Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;

 for i := 0 to Len - 1 do
 begin
  if i = skip_i  then
continue;

if RefIn then
      Result := Result xor reverse(ord(P[i]))
    else
      Result := Result xor (ord(P[i]) shl 8);
    for j := 0 to 7 do
    begin
      if (Result and $8000) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result);
  Result := Result xor XorOut;
end;
/////////////////////////////////////////////////////////


 function CRC16CCITT(P: PChar; Len: Word; skip_i: Integer): Word;
begin
  Result := CRC16(P, Len, skip_i ,  $1021, $FFFF, 0, False, False);
end;
//////////////////////////////////////////////////////////
Теперь так ?

Последний раз редактировалось BDA; 19.11.2021 в 18:51.
sergey.serg-72 вне форума Ответить с цитированием
Старый 16.11.2021, 16:54   #64
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,321
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Теперь так ?
Да, похоже на правду.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.11.2021, 22:26   #65
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, похоже на правду.
Да, точно похожа на правду, сегодня сам удивился как вчера тупил так, на ерунде.
перегруз видимо. Сегодня со свежей головой всё снова пробежал и всё понятно и ясно.
Все тесты прошла, всё корректно . Теперь зато есть два варианта на выбор, кому-то с едит, а кому то без едита. Всегда хорошо когда есть выбор. А главное без таблиц обошлись А универсальная функция это вообще бомба .

изучаю https://ru.wikipedia.org/wiki/Циклич...0%BE%D0%B2_CRC

Интересная таблица , ну про CRC8,16,32 слышали все. А вот про crc 3,4,5,8 и.т.д думаю что не многие.

Просмотрел таблицу есть CRC-15 и CRC-15/MPT1327 получается что контрольная сумма CRC-15 -0x59E 1,5 байта? , а вот CRC-15/MPT1327 так и не понял чем отличается (кроме входного полинома) от CRC16 ? как я понял что наша универсальная функция смело подходит под CRC-15/MPT1327 ?, впринципие у CRC-15 двух байтовый полином , всё так же как и в CRC16, только контрольная сумма странная -0x59E , а вот CRC-15/MPT1327 мне кажется сможет с нашими функциями работать смело без переделок.
Вот и вопрос, а зачем нужна CRC15, когда есть CRC16? так и не нашёл в интернете ответа на этот вопрос.
sergey.serg-72 вне форума Ответить с цитированием
Старый 16.11.2021, 22:41   #66
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,321
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
мне кажется сможет с нашими функциями работать смело без переделок
Без переделок точно не получится, так как у CRC15 и CRC16 разная степень полинома (width).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
а зачем нужна CRC15, когда есть CRC16?
Значит где-то удобнее. Нашел такое упоминание:
Цитата:
A 15-bit CRC is used in CAN protocols. The following sample CAN frame
(in binary here) is converted to hexadecimal for the calcWord call.
The bits after the 15-bit CRC are not included in the CRC::
0 11101000001 0 0 0 0001 00010010 011000010111011 1 1 1 1111111
This sample CAN frame was found in this paper:
<http://www.anthony-marino.com/documents/HDL_implementation_CAN.pdf>
Правда, ссылка у меня не открылась.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.11.2021, 01:09   #67
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Без переделок точно не получится, так как у CRC15 и CRC16 разная степень полинома (width).
(width) 15 СRС15 и у (width) 16 у СRС16 степени правильно?

function reverse(f: Word): Word;
begin
f := ((f shr 1) and $5555) or ((f and $5555) shl 1);
f := ((f shr 2) and $3333) or ((f and $3333) shl 2);
f := ((f shr 4) and $0F0F) or ((f and $0F0F) shl 4);
f := (f shr7) or (f shl 7);
Result := f;


Код:
 function CRC15(P: PChar; Len: Word;
 skip_ : Integer;  Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;

 for i := 0 to Len - 1 do
 begin
  if i = skip_ then
continue;

if RefIn then
      Result := Result xor reverse(ord(P[i]))
    else
      Result := Result xor (ord(P[i]) shl 7);
    for j := 0 to 7 do
    begin
      if (Result and $8000) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result);
  Result := Result xor XorOut;
end;
Наверное так ? или что то путаю ?

Цитата:
Сообщение от BDA Посмотреть сообщение
Правда, ссылка у меня не открылась.
и у меня не открывается .

Цитата:
Сообщение от BDA Посмотреть сообщение
Значит где-то удобнее. Нашел такое упоминание:
Не нашёл ничего конкретного. но как понял для радиосвязи.

Последний раз редактировалось BDA; 17.11.2021 в 01:24.
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 01:23   #68
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,321
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Наверное так ?
Функцию reverse не надо менять.
Код:
function CRC15(P: PChar; Len: Word; skip_i: Integer; Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;
  for i := 0 to Len - 1 do
  begin
    if i = skip_i then
      Continue;
    if RefIn then
      Result := Result xor (reverse(ord(P[i])) shr 1)
    else
      Result := Result xor (ord(P[i]) shl 7);
    for j := 0 to 7 do
    begin
      if (Result and $4000) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result) shr 1;
  Result := Result xor XorOut;
  Result := Result and $7FFF;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.11.2021, 01:44   #69
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Функцию reverse не надо менять.
Код:
function CRC15(P: PChar; Len: Word; skip_i: Integer; Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
i, j: Integer;
begin
Result := Init;
for i := 0 to Len - 1 do
begin
if i = skip_i then
Continue;
if RefIn then
Result := Result xor (reverse(ord(P[i])) shr 1)
else
Result := Result xor (ord(P[i]) shl 7);
for j := 0 to 7 do
begin
if (Result and $4000) <> 0 then
Result := (Result shl 1) xor Poly
else
Result := Result shl 1;
end;
end;
if RefOut then
Result := reverse(Result) shr 1;
Result := Result xor XorOut;
Result := Result and $7FFF;
end;

С reverse понятно .

Разница не большая но не всё ясно

(Result and $8000) // 4000 не ясно

Result := Result xor (ord(P[i]) shl 8);// 7 здесь ясно

Result := Result and $7FFF; // и здесь не понятно
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 02:02   #70
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,321
По умолчанию

В result 15битное число, поэтому для проверки старшего бита новая маска 4000. И перед возвратом из функции в result 16й бит обнуляется.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Opendialog завис DimOn4Ik Общие вопросы Delphi 12 02.11.2018 16:08
Реализация суммы в простом варианте. Mariolka PHP 8 10.11.2016 15:50
С++ сортировка в текстовом файле. (Задание на курсовик никак не получается) Evg888 Помощь студентам 1 02.06.2012 19:37
Житейская задачка о простом копировании mephist Помощь студентам 11 16.05.2009 20:42