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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Мне удалось. Если скормить строку "S304000000FB", то никаких ошибок не выдается, но эта строка слишком коротка, чтобы быть корректной записью типа S3.
Да, я тоже питона обманул, не понятно Hex сколько строку не обрезаю, меняя контрольную сумму, он хавает и типа всё гуд! но стоит хоть один байт из строки s19 сразу отлавливает этот вариант и пишет что строка не соответствует, странно как то...
Второй момент меняю : на S , или на оборот, тритон всё ровно открывает файл и типа корректно.
Как такое может быть?
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2022, 06:36   #382
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, нужно S проверять.
Поставил проверку S и if (st[i][2] < '0') or (st[i][2] > '9') , убираю шапку вверху и внизу, не портя файл, прога в ошибку уходит и зависает.... Не пойму, в чём проблема?
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2022, 06:39   #383
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А смысл перечислять все варианты, если два сравнения делают то же?
Сделал так зависать из за шапки перестало, странно опустил проверки вниз, всё нормально стало... сделал так :
Код:
 var
st: TStringList;
f: TFileStream;
i, j, k, len: integer;
sum: byte;
begin
Memo1.Clear;
label3.Caption:=' ';
label1.Caption:=' ';
label2.Caption:=' ';
OpenDialog1.Filter :='S19 (*.s19)|*.S19;*.s19|';
if not OpenDialog1.Execute then
exit;
f:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
st := TStringList.Create;
st.LoadFromFile(OpenDialog1.FileName);
with Memo1 do
begin
Clear;
Lines.BeginUpdate;
for i := 0 to st.Count - 1 do
begin
len := length(st[i]);
if len mod 2 <> 0 then
begin
Lines.Add(Format('Неправильная длина строки str № %d: %s', [i+1, st[i]]));
continue;
end;
k := -1;
sum := 0;
j := 3;
while j < len do
begin
k := StrToIntDef('$' + st[i][j] + st[i][j + 1], -1);
if k = -1 then
begin
Lines.Add(Format('Недопустимый символ в строке № %d: %s', [i+1, st[i]]));
end;
Inc(sum, k);
Inc(j, 2);
end;
if k = -1 then
continue;
if sum <> 255 then
begin
sum:= k - sum -1;
Lines.Add(Format('Ошибка контрольной суммы 0x%.2x (верная 0x%.2x) str № %d: %s', [k, sum, i+1, st[i]]));
continue;
end;
 if st[i][1] <> 'S' then
begin
Lines.Add(Format('Не хватает символа  S str № %d: %s', [i+1, st[i]]));
continue;
end;
if (st[i][2] < '0') or (st[i][2] > '9')  then
begin
Lines.Add(Format('Это строка не  Srec str ? %d: %s', [i+1, st[i]]));
continue;
end;
end;
if Lines.Count > 0 then
Lines.Add(' Есть ошибки !')
else
Lines.Add('Ошибок не выявлено ! ');
Lines.EndUpdate;
label2.Caption:= 'Количество байт в файле :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
Label1.Caption :='Количество строк в файле :  ' + IntToStr(st.Count-1+1);
Label3.Caption :=ExtractFileName(OpenDialog1.FileName);
end;
st.Free;
F.Free;
end;
А вот с проверкой на длину строки , не выходит.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
а SRecord ? действительно всё может ?
Не знаю, не запускал.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Второй момент меняю : на S , или на оборот, тритон всё ровно открывает файл и типа корректно.
Надо смотреть на конкретный пример строки. Тритон, предположительно, определяет тип содержимого (srec, hex, текст) по самому тексту, а не по расширению файла.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
прога в ошибку уходит и зависает
Почему именно зависает, нужно смотреть в режиме отладки. Проверять первый и второй символ можно только после того, когда сделана проверка на минимальную длину строки. Если строка короче 10 символов, то она точно не может описывать какую-либо srec запись. Если строка длиннее 514 символов, аналогично.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.04.2022, 07:52   #385
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Почему именно зависает, нужно смотреть в режиме отладки.
Код вверху, теперь не зависает. Вниз опустил проверку и всё зависать не стала.
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2022, 07:53   #386
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Проверять первый и второй символ можно только после того, когда сделана проверка на минимальную длину строки.
Вот опустил проверку и всё зависать перестало.
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2022, 07:55   #387
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если строка короче 10 символов, то она точно не может описывать какую-либо srec запись. Если строка длиннее 514 символов, аналогично.
Это понятно, не пойму как поставить проверку .

Надо как то проверку не только на минимальную строку может так
Код:
 len := length(st[i]);
if (len < 10) or(len > 514)   then
begin
Lines.Add(Format('Неправильная длина строки str № %d: %s', [i+1, st[i]]));
continue;
end;

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вниз опустил проверку и всё зависать не стала.
Повнимательнее посмотрел на код - проверка "k = -1" после цикла while даёт гарантию, что строка будет содержать хотя бы 4 символа, когда дойдет дело до проверки S и второго символа. Но это не сразу очевидно и в будущем можно об этом забыть. Так что лучше явно проверить длину, как вы и догадались:
Код:
      len := length(st[i]);
      if len mod 2 <> 0 then
      begin
        Lines.Add(Format('Длина строки должна быть четной str №% d: %s', [i + 1, st[i]]));
        continue;
      end;
      if len < 10 then
      begin
        Lines.Add(Format('Длина строки слишком мала str № %d: %s', [i + 1, st[i]]));
        continue;
      end;
      if len > 514 then
      begin
        Lines.Add(Format('Длина строки слишком велика str № %d: %s', [i + 1, st[i]]));
        continue;
      end;
      if st[i][1] <> 'S' then
      begin
        Lines.Add(Format('Не хватает символа S str № %d: %s', [i + 1, st[i]]));
        continue;
      end;
      if (st[i][2] < '0') or (st[i][2] > '9') then
      begin
        Lines.Add(Format('Несуществующий тип srec %d: %s', [i + 1, st[i]]));
        continue;
      end;
Лучше разбить на 2 разных ошибки, чтобы было чуть понятнее.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.04.2022, 23:00   #389
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Повнимательнее посмотрел на код - проверка "k = -1" после цикла while даёт гарантию, что строка будет содержать хотя бы 4 символа, когда дойдет дело до проверки S и второго символа. Но это не сразу очевидно и в будущем можно об этом забыть. Так что лучше явно проверить длину, как вы и догадались:
Код:
len := length(st[i]);
if len mod 2 <> 0 then
begin
Lines.Add(Format('Длина строки должна быть четной str №% d: %s', [i + 1, st[i]]));
continue;
end;
if len < 10 then
begin
Lines.Add(Format('Длина строки слишком мала str № %d: %s', [i + 1, st[i]]));
continue;
end;
if len > 514 then
begin
Lines.Add(Format('Длина строки слишком велика str № %d: %s', [i + 1, st[i]]));
continue;
end;
if st[i][1] <> 'S' then
begin
Lines.Add(Format('Не хватает символа S str № %d: %s', [i + 1, st[i]]));
continue;
end;
if (st[i][2] < '0') or (st[i][2] > '9') then
begin
Lines.Add(Format('Несуществующий тип srec %d: %s', [i + 1, st[i]]));
continue;
end;
Лучше разбить на 2 разных ошибки, чтобы было чуть понятнее.
Да хоть так,хоть этак .... строку не проверяет , вырезаю один байт и меняю контролку, тритон видит этот момент и бракует, а прога пропускает и всё типа хорошо, хотя строка не полная , не работает этот код , не полную строку, не проверяет....
Шапку верхнюю и нижнюю типа неправильная строка, верхняя 10 символов, нижняя 12 , код не рабочий. Не проверяет он корректность строки и всё тут. Не то это.

Чтоб компилятор не выписывал предупреждений сделал так :
Код:
 with Memo1 do
begin
Clear;
Lines.BeginUpdate;
for i := 0 to st.Count - 1 do
begin
len := length(st[i]);
if len mod 2 <> 0 then
begin
Lines.Add(Format('Äëèíà ñòðîêè äîëæíà áûòü ÷åòíîé str ¹% d: %s', [i + 1, st[i]]));
continue;
end;
if len < 10  then
begin
Lines.Add(Format('Äëèíà ñòðîêè ñëèøêîì ìàëà str ¹ %d: %s', [i + 1, st[i]]));
continue;
end;
if len > 76 then
begin
Lines.Add(Format('Äëèíà ñòðîêè ñëèøêîì âåëèêà str ¹ %d: %s', [i + 1, st[i]]));
continue;
end;
if st[i][1] <> 'S' then
begin
Lines.Add(Format('Íå õâàòàåò ñèìâîëà S str ¹ %d: %s', [i + 1, st[i]]));
continue;
end;
if (st[i][2] < '0') or (st[i][2] > '9') then
begin
Lines.Add(Format('Íåñóùåñòâóþùèé òèï srec %d: %s', [i + 1, st[i]]));
continue;
end;
k := -1;
sum := 0;
j := 3;
while j < len do
begin
k := StrToIntDef('$' + st[i][j] + st[i][j + 1], -1);
if k = -1 then
begin
Lines.Add(Format('Íåäîïóñòèìûé ñèìâîë â ñòðîêå ¹ %d: %s', [i+1, st[i]]));
end;
Inc(sum, k);
Inc(j, 2);
end;
if k = -1 then
continue;
if sum <> 255 then
begin
sum:= k - sum -1;
Lines.Add(Format('Îøèáêà êîíòðîëüíîé ñóììû 0x%.2x (âåðíàÿ 0x%.2x) str ¹ %d: %s', [k, sum, i+1, st[i]]));
continue;
end;
end;
if Lines.Count > 0 then
Lines.Add(' Åñòü îøèáêè !')
else
Lines.Add('Îøèáîê íå âûÿâëåíî ! ');
Lines.EndUpdate;
label2.Caption:= 'Êîëè÷åñòâî áàéò â ôàéëå :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
Label1.Caption :='Êîëè÷åñòâî ñòðîê â ôàéëå :  ' + IntToStr(st.Count-1+1);
Label3.Caption :=ExtractFileName(OpenDialog1.FileName);
end;
st.Free;
F.Free;
end;
Но это лишние телодвижения и строку не проверяет, с правильной контролкой и вырезанным одним байтом из строки. Плюс шапку бракует .... Нет, не то, по другому надо, или оставлять старый мой код вверху который. Всё ровно результат один и тот же.
Изображения
Тип файла: jpg 1.JPG (8.0 Кб, 3 просмотров)

Последний раз редактировалось sergey.serg-72; 05.04.2022 в 23:03.
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2022, 23:23   #390
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Лучше разбить на 2 разных ошибки, чтобы было чуть понятнее.
,Надо как то проверять строку на количество символов в строке, исключаю шапку.

Посчитал символы в 16 строковом файле : 42 символа в строке, в верхней шапке 10 символов, в нижней 12.
В 32 байта в строке - 76 символа в строке, в верхней шапке 10 символов, в нижней 12.
Вот это, как то надо проверять, но получается 4 разных длины, как тут условие ставить?
Шапку исключать тоже думаю надо.
Как то по другому надо проверять, толи циклом, толи ещё как .....
sergey.serg-72 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "2.txt" первых n строк и вставить их в "1.txt" temphard Помощь студентам 2 03.09.2013 16:03
Удаление первых n-строк из txt-файла Neksion Помощь студентам 2 10.07.2013 18:12
Создать чтение из файла и запись в файл txt на С++ skifre Фриланс 0 01.06.2012 16:16
поиск и выципление строк из txt файла D_e_n_n Помощь студентам 7 04.02.2011 05:39
C# Представление txt файла как массива строк asheb Помощь студентам 7 20.04.2010 12:51