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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
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;
Если по Вашему то выходит так : [Предупреждение] Unit1.pas(90): Variable 'sum' might not have been initialized
[Предупреждение] Unit1.pas(88): Variable 'k' might not have been initialized
[Совет] Unit1.pas(43): Variable 'j' is declared but never used in 'TForm1.SpeedButton1Click'


Прога показывает так : Ошибка контрольной суммы 0x00 (верная 0xFF) str № 1: S0030000FC
Есть ошибки !

А байт вырезанный из строки не видит и типа всё хорошо.
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2022, 23:38   #392
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
тритон видит этот момент и бракует, а прога пропускает и всё типа хорошо
Покажите эту строку.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Всё ровно результат один и тот же.
Проверки на длину все равно нужны. Да, они не помогли выявить именно те изменения, которые вносите вы, но они не бесполезны. Перед копированием кода не забывайте переключаться на русскую раскладку клавиатуры, чтобы не было кракозябр вместо текста.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Если по Вашему то выходит так : [Предупреждение] Unit1.pas(90): Variable 'sum' might not have been initialized
[Предупреждение] Unit1.pas(88): Variable 'k' might not have been initialized
Вы удалили код "k := -1; sum := 0;"?
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
[Совет] Unit1.pas(43): Variable 'j' is declared but never used in 'TForm1.SpeedButton1Click'
Вы удалили цикл "while j < len do"?
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А байт вырезанный из строки не видит и типа всё хорошо.
Не нашел явного запрета на то, чтобы в S0 записи обязательно были data байты (хотя они там ожидаются - можно выдать предупреждение, что их нет, но они желательны). А в общем виде для srec строка содержит минимально необходимые 10 символов. В текущем виде программа выдает по каждой строке только одну ошибку (самую первую выявленную), поэтому если в будущем программа будет более точно проверять длину строки для каждого типа, но ошибка контрольной суммы будет проверяться сначала, то только о ней и будет сообщено.
Изображения
Тип файла: png Field Composition of an S-Record.png (46.8 Кб, 1 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Покажите эту строку.
S11300000C94F2510C940A4B0CF2510C942 5
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 00:51   #394
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы удалили код "k := -1; sum := 0;"?
нет не удалял .
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 00:52   #395
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы удалили цикл "while j < len do"?
нет не удалял я цикл.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 01:00   #396
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Проверки на длину все равно нужны. Да, они не помогли выявить именно те изменения, которые вносите вы, но они не бесполезны. Перед копированием кода не забывайте переключаться на русскую раскладку клавиатуры, чтобы не было кракозябр вместо текста.
Эта проверка важная, если файл портится, или его умышленно портят, то удаляют байт, другой и меняют контролку, или в процессе считывания искажение на линии передачи байт, два потерялись контролка совпала , а по факту файл повреждён. Тритон это видимо хорошо понимает, раз учёл этот момент. А вот остальное, второстепенно уже.
Да переключение здесь не поможет, обычно перезагрузка компа помогает и кракозябр нет, а в процессе множественных исправлений, копирований, опять кракозябры, пока не перезагрузишь.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 01:09   #397
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы удалили код "k := -1; sum := 0;"?
Цитата:
Сообщение от sergey.serg-72
[Совет] Unit1.pas(43): Variable 'j' is declared but never used in 'TForm1.SpeedButton1Click'
Вы удалили цикл "while j < len do"?

Код:
 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 > 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;
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;
Вот так сделал, предупреждений и ошибок нет, но байт, два вырезанных невидет.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 01:10   #398
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
S11300000C94F2510C940A4B0CF2510C942 5
Добавьте после проверки контрольной суммы:
Код:
      if 2 * StrToInt('$' + st[i][3] + st[i][4]) + 4 <> len then
      begin
        Lines.Add(Format('Указанная в строке длина не соответствует настоящей %d: %s', [i + 1, st[i]]));
        continue;
      end;
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
не удалял
Тогда где-то с begin и end путаница возникла, раз компилятор предупреждает. У меня таких сообщений нет.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
обычно перезагрузка компа помогает и кракозябр нет
Странно. У меня кракозябры вставляются, когда текст копировался с английской раскладкой клавиатуры, а если переключиться сначала на русскую, то всё хорошо.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Проверки на длину все равно нужны
Скачал с инета конвертер, сконвертировал файл, тритон свободно и без нареканий открывает файл, конвертировает в бин, другой конвертер пишет оишбка и в бин не конвертит, третий конвертит без проблем. Наша пишет : Длина строки слишком мала str № 2049:
Есть ошибки ! не выводя строку в программу.

Со старым кодом всё пишет окей ! Ошибок не выявлено !

Где правильно ? не путает ли новый код с проверкой ?
Код:
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;
Что даёт эта проверка? тритон не артачится, другие тоже, а с новым кодом проблема.
файл прилагаю.
Вложения
Тип файла: rar Тестовый - который надо преобразовать.rar (44.8 Кб, 1 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 01:49   #400
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
не выводя строку в программу
Строка выводится, просто она нулевой длины. Сами посмотрите в текстовом редакторе, что именно в 2049 строке находится.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
тритон не артачится
Наверное, он игнорирует пустые строки. Добавьте перед всеми проверками длины:
Код:
if len = 0 then
  continue;
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Что даёт эта проверка?
Если строка короче 10 и длиннее 514, то она точно не может описывать корректную srec запись. После этих проверок можно проверять 1 и 2 символы, так как они точно есть в строке.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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