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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2021, 17:56   #161
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
на 1, но только в данном случае
В этом, кажется, не прав. Даже без исключения байта тритон уже захватывает 2 лишних байта в конце (по сравнению с выделенным диапазоном). А если один байт исключить, то прибавлять к адресу нужно будет уже 3, но в файле нет 3 лишних байтов (в конце всего 2). Так что нужно смотреть, как в этом случае выкручивается тритон (какой диапазон берет).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
когда есть совпадение, окошко вылетало
Попробуйте так:
Код:
Fs.Position := addr1;
SetLength(buffer, buf_len);
Fs.Read(buffer[1], buf_len);
Fs.free;
crc :=CRC16MODBUS(PChar(buffer), buf_len, skip_ - addr1, skip_2 - addr1);
edit2.Text := IntToHex(crc, 4);
if w = crc then
  MessageBox(handle, PChar('Есть совпадение!'), PChar('Сообщение'), MB_ICONINFORMATION);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.11.2021, 23:13   #162
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию 12334

Цитата:
Сообщение от BDA Посмотреть сообщение
Fs.Position := addr1;
SetLength(buffer, buf_len);
Fs.Read(buffer[1], buf_len);
Fs.free;
crc :=CRC16MODBUS(PChar(buffer), buf_len, skip_ - addr1, skip_2 - addr1);
edit2.Text := IntToHex(crc, 4);

if w = crc then
MessageBox(handle, PChar('Есть совпадение!'), PChar('Сообщение'), MB_ICONINFORMATION);


Нет при совпадении окошка не вылетает. полный игнор.
И я заметил, что косяки в программме из за Checksum16 . открываешь любые всё гуд, как только открыл Checksum16 и после любой другой. сразу ошибка и процесс занят. Именно с Checksum16 связано, что то не то с кодом. почему после него другие не открываются, а в ошибку уходят и процесс занят?...
sergey.serg-72 вне форума Ответить с цитированием
Старый 25.11.2021, 01:18   #163
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

BDA. а Checksum-32 можно тоже функцию . или это уже не выполнимо ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 25.11.2021, 01:43   #164
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
почему после него другие не открываются, а в ошибку уходят
Покажите код кнопки для вызова подсчета Checksum16 целиком.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Checksum-32 можно тоже функцию
Да практически то же, что и Checksum16:
Код:
function checksum32(P: PChar; Len: Word; skip_1, skip_2: Integer): LongWord;
var
  i, j: Integer;
begin
  Result := 0;
  j := 0;
  for i := 0 to Len - 1 do
  begin
    if (i = skip_1) or (i = skip_2) then
      Continue;
    Result := Result + ord(P[i]) shl (8 * j);
    j := (j + 1) mod 4;
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 25.11.2021, 01:47   #165
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
function checksum32(P: PChar; Len: Word; skip_1, skip_2: Integer): LongWord;
var
i, j: Integer;
begin
Result := 0;



j := 0;
for i := 0 to Len - 1 do
begin
if (i = skip_1) or (i = skip_2) then
Continue;
Result := Result + ord(P[i]) shl (8 * j);
j := (j + 1) mod 4;
end;
end;


Я вчера вроде пробовал так, но у меня не выходила нужная сумма, сейчас попробую.
sergey.serg-72 вне форума Ответить с цитированием
Старый 25.11.2021, 01:59   #166
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
function checksum32(P: PChar; Len: Word; skip_1, skip_2: Integer): LongWord;
var
i, j: Integer;
begin
Result := 0;
j := 0;
for i := 0 to Len - 1 do
begin
if (i = skip_1) or (i = skip_2) then
Continue;
Result := Result + ord(P[i]) shl (8 * j);
j := (j + 1) mod 4;
end;
end;

Правильно , я вчера такую же функцию использовал, но результат не верный, сейчас перепроверил .
результат Тритон :А1186956
Программа ; F4AF6956
Суммы на выходе разные.


Код такой :
Код:
 var
A: array  of longword; //
f: TFileStream;
crc,w: longWord;
 addr1, addr2, addr3,skip_1 ,skip_2, buf_len:integer;

begin

with OpenDialog1 do
if Execute then
begin
F:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
if F.Size < 0  then
begin
ShowMessage('íå òîò ôàéë  !');
F.Free;
exit;
end;
begin
 edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit6.Text, -1); // eiia?iue aa?an
F.Position :=addr3;
F.Read(w, 4);
//w := swap(w);
Edit4.Text:=' '+IntToHex(w,4);
skip_2:= StrToIntDef('$' + Edit8.Text,-1);
skip_1 := StrToIntDef('$' + Edit7.Text,-1);  //
addr1 := Strtoint('$' + Edit1.Text); //
addr2 := Strtoint('$' + Edit3.Text); //
buf_len:= addr2 - addr1;
F.Position:= addr1;;
SetLength(A,  buf_len);
F.Read(A[0], buf_len);
crc :=checksum32(PChar(A), buf_len, skip_1 - addr1, skip_2 - addr1 );

edit2.Text := IntToHex(crc, 4);
label1.Caption:='Checksum_32 ';
if w = crc then
MessageBox(handle, PChar('есть совпадение'), PChar('сообщение'), MB_ICONINFORMATION);
A:=nil;
end;
F.Free;
end;
end;
Вроде всё правильно, но результат не тот .

Последний раз редактировалось sergey.serg-72; 25.11.2021 в 02:05.
sergey.serg-72 вне форума Ответить с цитированием
Старый 25.11.2021, 02:29   #167
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Тритон :А1186956
Программа ; F4AF6956
Суммы на выходе разные.
Потому что тритон посчитал сумму не от выделенного диапазона, а захватил еще 2 байта в конце. Попробуйте в тритоне выделить файл целиком - будет та же сумма.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 25.11.2021, 02:47   #168
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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

А программа когда полностью файл, то совпадает, если ограничить адресом, то сумма другая, а Тритон, что так, что так, сумма одна, это неправильно, значит тритон косячит ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 25.11.2021, 02:50   #169
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Покажите код кнопки для вызова подсчета Checksum16 целиком.
Вот код полностью :

Код:
var
A: array  of word; //
f: TFileStream;
crc,w: Word;
 addr1, addr2, addr3,skip_1,skip_2, buf_len:integer;
begin
label1.Caption:=' ';
edit2.Clear;
edit4.Clear;
edit5.Clear;
OpenDialog1.Filter := 'BIN (*.bin)|*.bin';
with OpenDialog1 do
if Execute then
begin
F:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
if F.Size < 0  then
begin
ShowMessage('не тот файл  !');
F.Free;
exit;
end;
begin
 edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit6.Text, -1); // eiia?iue aa?an
F.Position :=addr3;
F.Read(w, 2);
//w := swap(w);
Edit4.Text:=' '+IntToHex(w,2);
skip_2:= StrToIntDef('$' + Edit8.Text,-1);
skip_1 := StrToIntDef('$' + Edit7.Text,-1);  //
addr1 := Strtoint('$' + Edit1.Text); //
addr2 := Strtoint('$' + Edit3.Text); //
buf_len:= addr2 - addr1;
F.Position:= addr1;;
SetLength(A,  buf_len);
F.Read(A[0], buf_len);
crc :=checksum16(PChar(A), buf_len, skip_1 - addr1, skip_2 - addr1 );
edit2.Text := IntToHex(crc, 4);
label1.Caption:='Checksum_16 ';
if w = crc then
MessageBox(handle, PChar('Есть совпадение!'), PChar('Сообщение'), MB_ICONINFORMATION);
A:=nil;
end;
F.Free;
end;
end;
sergey.serg-72 вне форума Ответить с цитированием
Старый 25.11.2021, 06:12   #170
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
сумма одна, это неправильно, значит тритон косячит ?
Ну он мог бы явно как-то сообщать, что берет другой диапазон. Просто sum32 предполагает складывание 32битных чисел (4 байта), а если диапазон не кратен 4 байтам, то тритон выкручивается как может. Кстати, инструкция есть (http://www.triton-prog.ru/Dnl/Triton.pdf), но там про кнопку SUM буквально один абзац.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
A: array of word;
buf_len считается в байтах, так что и массив нужно делать типа Byte.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
A:=nil;
F.Free;
Их нужно разместить до показа MessageBox. Тогда, скорее всего, не будет ошибок о занятости файла.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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