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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2021, 22:52   #31
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,306
По умолчанию

К функции относится только код до continue включительно. Остальное в процедуре. Если хочется менять начальный, конечный и адрес для игнорирования, то удобнее 3 эдита (или spinedit или scrollbar, но это уже украшательства для удобства пользователя).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 13.11.2021, 23:00   #32
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
К функции относится только код до continue включительно. Остальное в процедуре. Если хочется менять начальный, конечный и адрес для игнорирования, то удобнее 3 эдита (или spinedit или scrollbar, но это уже украшательства для удобства пользователя).

значит с функцией я правильно разобрался.
Тогда не понятно с процедурой : 1)
Код:
begin_addr := // забрать из эдита
end_addr := // забрать из эдита
// проверить, что 0 <= begin_addr <= end_addr < 96
skip_addr := // забрать из эдита

buf_len := end_addr - begin_addr + 1;
если вставляю в процедуру то компилятор не опознаёт раз skip_addr :=
два buf_len
с buf это надо создавать новую переменную. или это моя переменная Buffer: String;?

что за переменные addr - begin_addr ?

Согласен пусть будет три эдита, красота не нужна.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.11.2021, 23:05   #33
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,306
По умолчанию

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, нужно объявить горсть новых переменных (4 штуки).
переменных типа word, int64, или string?

И как быть с этим из функции её тоже как переменную skip_ . ? компилятор не видит её из процедуры ...

Цитата:
Сообщение от BDA Посмотреть сообщение
К функции относится только код до continue включительно. Остальное в процедуре. Если хочется менять начальный, конечный и адрес для игнорирования, то удобнее 3 эдита (или spinedit или scrollbar, но это уже украшательства для удобства пользователя).
Вот что получилось, но считает не верно, где я ошибся ?
Код:
 function CRC16XMODEM(P: PChar; Len: Word; skip_i: Integer): Word;
var
i, j: Integer;
begin
Result := 0;
for i := 0 to Len - 1 do
begin
if i = skip_i then
continue;
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 $1021
else
Result := Result shl 1;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
addr1,addr2,buf_len:int64; // переменные для начального адреса и конечного 
skip_: byte; // переменная для адреса байта исключения
crc,W: Word;
buffer: String;
fs: TFileStream;
Begin
edit2.Clear;
edit4.Clear;
edit5.Clear;
OpenDialog1.Filter:='BIN (*.bin)|*.bin';
with OpenDialog1 do
if Execute then
begin
fs:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
if fs.Size < >96 then
begin
ShowMessage('не допустимый размер файла  !');
Fs.free;
exit;
end
else
begin
Fs.Position:=$05E;
Fs.Read(w,2);
w:=swap(w );
edit4.Text:=IntToHex(w,2);     // выводим прописанную контрольную сумму
end;
begin
skip_:=Strtoint('$' + Edit1.Text); // байт который надо исключить
addr1:=Strtoint('$' + Edit3.Text); // начальный адрес
addr2:=Strtoint('$' + Edit6.Text); // конечный адрес
end;
begin
buf_len :=addr1 - skip_ + 1;
Fs.Position :=addr1;
SetLength(buffer, buf_len);
Fs.Read(buffer[1], buf_len);
crc := CRC16XMODEM(PChar(buffer), buf_len, skip_ - addr2);
edit2.Text :=IntToHex(crc, 2);
end;
Fs.free;
end;
end;
Не пойму, что не так, где ошибся?

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

Пора уже начинать писать код с отступами (или хотя бы нажимать "автоформатирование"). Не запускал, но примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  addr1, addr2, skip_, buf_len: Integer;
  crc, W: Word;
  buffer: String;
  fs: TFileStream;
begin
  edit2.Clear;
  edit4.Clear;
  edit5.Clear;
  OpenDialog1.Filter := 'BIN (*.bin)|*.bin';
  with OpenDialog1 do
    if Execute then
    begin
      fs := TFileStream.Create(FileName, fmOpenRead);
      if fs.Size <> 96 then
      begin
        ShowMessage('недопустимый размер файла!');
        Fs.free;
        exit;
      end;
      Fs.Position := $05E;
      Fs.Read(w, 2);
      w := swap(w);
      edit4.Text := IntToHex(w, 2);     // выводим прописанную контрольную сумму
      skip_ := Strtoint('$' + Edit1.Text); // байт который надо исключить
      addr1 := Strtoint('$' + Edit3.Text); // начальный адрес
      addr2 := Strtoint('$' + Edit6.Text); // конечный адрес
      buf_len := addr2 - addr1 + 1;
      Fs.Position := addr1;
      SetLength(buffer, buf_len);
      Fs.Read(buffer[1], buf_len);
      crc := CRC16XMODEM(PChar(buffer), buf_len, skip_ - addr1);
      edit2.Text := IntToHex(crc, 2);
      Fs.free;
    end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2021, 01:44   #36
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Пора уже начинать писать код с отступами (или хотя бы нажимать "автоформатирование"). Не запускал, но примерно так:
Я плохо читаю когда с отступами. не вижу кода. я понимаю что таково правило.
Но я ч отступами. на оборот плохо. Сейчас найду автоформатирование. попробую.

да,у меня почти так же, исправил как у ВАС. но результат нулевой. считает всё ровно не верно. где то ошибка явно.
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.11.2021, 01:54   #37
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,306
По умолчанию

Визуально в коде проблем не вижу, так что проверьте, что именно вписываете эдиты в качестве начального, конечного адресов и адреса пропуска.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2021, 02:03   #38
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Визуально в коде проблем не вижу, так что проверьте, что именно вписываете эдиты в качестве начального, конечного адресов и адреса пропуска.
В первый едит ввожу как положено 2b (байт исключения по этому адресу. в третий едит ввожу начальный адрес 0 . в 6 едит ввожу 05е.

Ошибку нашёл. исправил и теперь всё отлично. ошибка в этой строке :
buf_len := addr2 - addr1 +1;
когда отнимаем от конечного адреса начальный и присваиваем переменной buf_len
то +1 не надо. не надо прибавлять.
Надо так : buf_len := addr2 - addr1;
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.11.2021, 02:20   #39
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,306
По умолчанию

Да, это зависит от интерпретации конечного адреса (входит или нет этот адрес в диапазон для расчёта).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2021, 02:29   #40
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, это зависит от интерпретации конечного адреса (входит или нет этот адрес в диапазон для расчёта).
Ну. если мы берём конечный адрес как крайний. то конечно он входит, значит +1 это уже перескок на один адрес вперёд. А это неправильно.

Сейчас появилась проблема, при загрузке файла пишет что занят другим процессом .видимо редактором. но раньше этого не было. мешает здорово. разбираюсь что не нравиться.

И последний момент. думаю важный. чтоб универсально было.
Если не надо исключать байт из подсчёта. а пересчитать полностью.
То есть надо сделать чтоб ввёл в едит1 байт исключения. исключает, если не ввёл значит чтоб считал полностью. без исключения. это в функции менять надо ?
sergey.serg-72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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