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

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

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

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

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

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

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

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

В общем сегодня многие не довольны были заданием и считают что почти не выполнимо, лузерам уж точно. Просили исключить комбобокс. Препод категорически отказался. типа батан сделал. значит достижимо. Но дал новую вводную, чтоб не путались.
В комбобоксе у нас 4 вкладки, можно и три сделать. Так как прошли материал по S19, S28 и S37
значит в закрепление материала , отработать за одно все три S.
Раз три вкладке значит на первой вкладке будет отрабатываться S19
case Combobox1.ItemIndex of
0:begin
start_pos := S19;
end_pos := S19;
start_pos := S19;
end_pos := S19;
start_pos := S19;
end_pos := S19;
start_pos := S19;
end_pos := S19;
end;
Диапазон от 0 до 65536 байт , адреса произвольно на свой выбор но не менее 8.

1:begin
start_pos := S28;
end_pos := S28;
start_pos := S28;
end_pos := S28;
start_pos := S28;
end_pos := S28;
start_pos := S28;
end_pos := S28;
end;

Диапазон от 65537 до 16777216 байт , адреса на выбор но не менее 8.


2:begin
start_pos := S37;
end_pos := S37;;
start_pos := S37;
end_pos := S37;
start_pos := S37;
end_pos := S37;;
start_pos := S37;
end_pos := S37;
end;

диапозон от 16777217 и до ...... соответственно адреса на выбор , но не менее 8.

Остальное , всё как вчера , всё что между start_pos и end_pos выводится в текстовый файл (а что не попало в этот диапазон, то пропускается).

Это чтоб не было повторений и на каждой вкладке комбобокса свои адреса и размеры.
Адреса сейчас сделаю, но это не принципиально.

p.s
Методом долгого допроса, удалось выведать у батана принцип.
как у меня был первоначально каждая вкладка обрабатывалась

If Combobox1.ItemIndex = 0 then
..............
.................

If Combobox1.ItemIndex = 1 then
........................
.........................

If Combobox1.ItemIndex = 2 then
........................
.....................
Как я и предполагал, массив не использовал. а как то буфер переходной ко всем вкладкам.

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

Цитата:
Сообщение от BDA Посмотреть сообщение
То есть размер файлов ограничен (чтобы большие не обрабатывать), но произволен и не зависит от выбранной строки комбобокса?
Вот сделал тестовые файлы и адреса сделал. От этого и плясать.

Код:
 case Combobox1.ItemIndex of
0:begin
start_pos := $0000;   // S19
end_pos := $06C0;
start_pos := $0870;
end_pos := $1F20;
start_pos := $2080;
end_pos := $3A90;
start_pos := $3DD0;
end_pos := $42C0;
start_pos := $4C60;
end_pos := $58E0;
start_pos := $6030;
end_pos := $73C0;
start_pos := $BAE0;
end_pos := $BF60;
start_pos := $0E800;
end_pos := $FFFF;
end;
Диапазон от 0 до 65536 байт , адреса произвольно на свой выбор но не 

менее 8.
////////////////////////////////////////////////////

1:begin
start_pos := $10020;   // S28
end_pos := $103D0;
start_pos := $10470;
end_pos := $10AB0;
start_pos := $11021;
end_pos := $115E0;
start_pos := $11A10;
end_pos := $12660;
start_pos := $13450;
end_pos := $16E50;
start_pos := $19050;
end_pos := $1C600;
start_pos := $2A800;
end_pos := $2D9A0;
start_pos := $70BB0;
end_pos := $80880;
end;
Диапазон   от 65537  до 16777216 байт  , адреса произвольно на свой 

выбор но не менее  8
/////////////////////////////////////////////////////////////////


2:begin
start_pos := $1001B90;   // S37
end_pos := $1001F70;
start_pos := $01002010;
end_pos := $1003EB0;
start_pos := $1004490;
end_pos := $10059A0;
start_pos := $1005CE0;
end_pos := $10071E0;
start_pos := $1007F90;
end_pos := $1008710;
start_pos := $10092D0;
end_pos := $ 100A510;
start_pos := $100CA50;
end_pos := $100E670;
start_pos := $1420230;
end_pos := $1432BB0;
end;
Диапазон  от 16777217 и до ......  7 байт адресация   , адреса 

произвольно на свой выбор но не менее  8
Вложения
Тип файла: rar Тестовые файлы.rar (152.1 Кб, 1 просмотров)

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

Ну что сказать в адресе по S19 ошибку допустил, исправил адреса .
далее опробовал по S19 код работает, но как я и вчера заметил обрезает последний байт. что в корне не правильно и такого быть не должно. И уверен что виновник ошибки min(модуль math) он здесь явно не нужен. только портит файл.
код
Код:
 const
BYTES_IN_LINE = 16;
sLineEnd = #13#10;
ranges: array[0..7] of array[0..1] of Integer = (
    ($0000, $06C0),
    ($0870, $1F20),
    ($2080, $3A90),
    ($3DD0, $42C0),
    ($4C60, $58E0), 
    ($6030, $73C0),
    ($0BAE0, $BF60),
    ($0E800, $FFFF)
  );
var
  fbin, ftxt: TFileStream;
  s, data_s: string;
  b: TBytes;
  addr: Int64;
  i, j, count, read_count: Integer;
  sum: byte;

begin
case Combobox1.ItemIndex of
0:
begin
Button1.Visible:=true;
end;
1:
begin
Button1.Visible:=true;
end;
2:
begin
Button1.Visible:=true;
end;
else
ShowMessage('Не выбран диапазон!');
exit;
end;
begin
  fbin := nil;
  ftxt := nil;
try
try
dlgOpen.Filter := 'Bin (*.Bin)|*.Bin;*.bin|';
if not dlgOpen.Execute then
exit;
fbin := TFileStream.Create(dlgOpen.FileName, fmOpenRead or fmShareDenyWrite);
 if fbin.Size >  65536  then
 raise Exception.Create('Слишком большой файл!');
if fbin.Size < 5 then
raise Exception.Create('Слишком маленький файл!');
dlgSave.Filter := 'Motorola S19 (*.s19)|*.s19|Motorola (*.srec; *.s)|*.srec; *.s';
dlgSave.FileName := ChangeFileExt(dlgOpen.FileName, '.s19');
dlgSave.DefaultExt := 's19';
if not dlgSave.Execute then
exit;
ftxt := TFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyWrite);
SetLength(b, BYTES_IN_LINE);
s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));
for j := Low(ranges) to High(ranges) do
begin
if ranges[j, 0] < fbin.Size then
fbin.Position := ranges[j, 0]
else
Break;
while fbin.Position < Min(fbin.Size, ranges[j, 1]) do
begin
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges[j, 1] - addr));
count := read_count + 3;
sum := count + addr and $FF + (addr shr 8) and $FF;
data_s := '';
for i := 0 to read_count - 1 do
begin
data_s := data_s + IntToHex(b[i], 2);
Inc(sum, b[i]);
end;
sum := $FF - sum;
s := Format('S1%.2x%.4x%s%.2x', [count, addr, data_s, sum]) + sLineEnd;
ftxt.Write(s[1], Length(s));
end;
end;
s := 'S9030000FC' + sLineEnd;
ftxt.Write(s[1], Length(s));
s := 'Файл успешно преобразован и записан.';
Application.MessageBox(PAnsiChar(s), 'Converter', MB_Ok + MB_ICONINFORMATION);
except
on E : Exception do
Application.MessageBox(PAnsiChar(E.Message), 'Converter', MB_Ok + MB_ICONERROR);
end;
finally
fbin.Free;
ftxt.Free;
end;
end;
end;
Исправил адреса для S19
Код:
 ($0000, $06C0),
    ($0870, $1F20),
    ($2080, $3A90),
    ($3DD0, $42C0),
    ($4C60, $58E0), 
    ($6030, $73C0),
    ($0BAE0, $BF60),
    ($0E800, $FFFF)
С S19 можно сказать решили, не считая того, что последний байт не записывается.

Но как теперь к следующей переходить ? IF Combobox1.ItemIndex =1 then ? не понятно ...
Изображения
Тип файла: jpg 1.JPG (19.8 Кб, 6 просмотров)
Вложения
Тип файла: rar файл для S19.rar (24.8 Кб, 0 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Это чтоб не было повторений и на каждой вкладке комбобокса свои адреса и размеры.
То есть при выборе 0й строки комбобокса должны обрабатываться файлы только того размера, что влезает в s19? А при выборе 1й строки только файлы уже не влезающие в s19, но влезающие в s28?
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
не считая того, что последний байт не записывается.
Код:
($0E800, $10000)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 04.02.2022 в 02:19.
BDA вне форума Ответить с цитированием
Старый 04.02.2022, 06:43   #216
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
То есть при выборе 0й строки комбобокса должны обрабатываться файлы только того размера, что влезает в s19? А при выборе 1й строки только файлы уже не влезающие в s19, но влезающие в s28?
можно сказать и так , почти всё получилось но есть, проблемы 2 :
Код:
 const
BYTES_IN_LINE = 16;
sLineEnd = #13#10;

 const
ranges: array[0..7] of array[0..1] of Integer = (     // S19
    ($0000, $06C0),
    ($0870, $1F20),
    ($2080, $3A90),
    ($3DD0, $42C0),
    ($4C60, $58E0),
    ($6030, $73C0),
    ($0BAE0, $BF60),
    ($0E800, $FFFF)
  );
 const
ranges1: array[0..7] of array[0..1] of Integer = (   //S28
    ($10020, $103D0),
    ($10470, $10AB0),
    ($11021, $115E0),
    ($11A10, $12660),
    ($13450, $16E50),
    ($19050, $1C600),
    ($2A800, $2D9A0),
    ($70BB0, $80880)
  );

 const
ranges2: array[0..7] of array[0..1] of Integer = (   // S37
    ($1001B90, $1001F70),
    ($01002010, $1003EB0),
    ($1004490, $10059A0),
    ($1005CE0, $10071E0),
    ($1007F90, $1008710),
    ($10092D0, $100A510),
    ($100CA50, $100E670),
    ($1420230, $1432BB0)
  );

var
  fbin, ftxt: TFileStream;
  s, data_s: string;
  b: TBytes;
  addr: Int64;
  i, j, count, read_count: Integer;
  sum: byte;
begin
case Combobox1.ItemIndex of
0:
begin
Button1.Visible:=true;
end;
1:
begin
Button1.Visible:=true;
end;
2:
begin
Button1.Visible:=true;
end;
else
ShowMessage('Не выбран диапазон!');
exit;
end;
begin
if Combobox1.ItemIndex= 0 then                 // S19
begin
dlgOpen.Filter := 'Bin (*.Bin)|*.Bin;*.bin|';
if not dlgOpen.Execute then
exit;
fbin := TFileStream.Create(dlgOpen.FileName, fmOpenRead or fmShareDenyWrite);
dlgSave.Filter := 'Motorola S19 (*.s19)|*.s19|Motorola (*.srec; *.s)|*.srec; *.s';
dlgSave.FileName := ChangeFileExt(dlgOpen.FileName, '.s19');
dlgSave.DefaultExt := 's19';
if not dlgSave.Execute then
exit;
ftxt := TFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyWrite);
SetLength(b, BYTES_IN_LINE);
s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));
for j := Low(ranges) to High(ranges) do
begin
if ranges[j, 0] < fbin.Size then
fbin.Position := ranges[j, 0]
else
Break;
while fbin.Position < Min(fbin.Size, ranges[j, 1]) do
begin
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges[j, 1] - addr));
count := read_count + 3;
sum := count + addr and $FF + (addr shr 8) and $FF;
data_s := '';
for i := 0 to read_count - 1 do
begin
data_s := data_s + IntToHex(b[i], 2);
Inc(sum, b[i]);
end;
sum := $FF - sum;
s := Format('S1%.2x%.4x%s%.2x', [count, addr, data_s, sum]) + sLineEnd;
ftxt.Write(s[1], Length(s));
end;
end;
s := 'S9030000FC' + sLineEnd;
ftxt.Write(s[1], Length(s));
s := 'Файл успешно преобразован и записан.';
Application.MessageBox(PAnsiChar(s), 'Converter', MB_Ok + MB_ICONINFORMATION);
fbin.Free;
ftxt.Free;
exit;
end;
end;
////////////////////////////////////////////////  S28



if Combobox1.ItemIndex= 1 then
begin
dlgOpen.Filter := 'Bin (*.Bin)|*.Bin;*.bin|';
if not dlgOpen.Execute then
exit;
fbin := TFileStream.Create(dlgOpen.FileName, fmOpenRead or fmShareDenyWrite);
dlgSave.Filter := 'Motorola S28 (*.s28)|*.s28|Motorola (*.srec; *.s)|*.srec; *.s';
dlgSave.FileName := ChangeFileExt(dlgOpen.FileName, '.s28');
dlgSave.DefaultExt := 's28';
if not dlgSave.Execute then
exit;
ftxt := TFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyWrite);
SetLength(b, BYTES_IN_LINE);
s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));
for j := Low(ranges1) to High(ranges1) do
begin
if ranges1[j, 0] < fbin.Size then
fbin.Position := ranges1[j, 0]
else
Break;
while fbin.Position < Min(fbin.Size, ranges1[j, 1]) do
begin
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges1[j, 1] - addr));
count := read_count + 4;
sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF;
data_s := '';
for i := 0 to read_count - 1 do
begin
data_s := data_s + IntToHex(b[i], 2);
Inc(sum, b[i]);
end;
sum := $FF - sum;
s := Format('S2%.2x%.6x%s%.2x', [count, addr, data_s, sum]) + sLineEnd;
ftxt.Write(s[1], Length(s));
end;
end;
s := 'S804000000FB' + sLineEnd;
ftxt.Write(s[1], Length(s));
s := 'Файл успешно преобразован и записан.';
Application.MessageBox(PAnsiChar(s), 'Converter', MB_Ok + MB_ICONINFORMATION);
fbin.Free;
ftxt.Free;
exit;
end;

////////////////////////////////////////////   S37


if Combobox1.ItemIndex= 2 then
begin
dlgOpen.Filter := 'Bin (*.Bin)|*.Bin;*.bin|';
if not dlgOpen.Execute then
exit;
fbin := TFileStream.Create(dlgOpen.FileName, fmOpenRead or fmShareDenyWrite);
dlgSave.Filter := 'Motorola S37(*.s37)|*.s37|Motorola (*.srec; *.s)|*.srec; *.s';
dlgSave.FileName := ChangeFileExt(dlgOpen.FileName, '.s37');
dlgSave.DefaultExt := 's37';
if not dlgSave.Execute then
exit;
ftxt := TFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyWrite);
SetLength(b, BYTES_IN_LINE);
s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));
for j := Low(ranges2) to High(ranges2) do
begin
if ranges2[j, 0] < fbin.Size then
fbin.Position := ranges2[j, 0]
else
Break;
while fbin.Position < Min(fbin.Size, ranges2[j, 1]) do
begin
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges2[j, 1] - addr));
count := read_count + 5;
sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF;
data_s := '';
for i := 0 to read_count - 1 do
begin
data_s := data_s + IntToHex(b[i], 2);
Inc(sum, b[i]);
end;
sum := $FF - sum;
s := Format('S3%.2x%.8x%s%.2x', [count, addr, data_s, sum]) + sLineEnd;
ftxt.Write(s[1], Length(s));
end;
end;
s := 'S70500000000FA' + sLineEnd;
ftxt.Write(s[1], Length(s));
s := 'Файл успешно преобразован и записан.';
Application.MessageBox(PAnsiChar(s), 'Converter', MB_Ok + MB_ICONINFORMATION);
fbin.Free;
ftxt.Free;
exit;
end;
end;
1) проблема в S19 обрезается последний байт, в S28 и в S37 обрезается последняя строка.
2) проблема не удалось впихнуть ограничение размера , не получилось.
Но это не так страшно. если размер меньше, не все данные влезают , в S28 и в S37 только шапка , если маленький файл.

Преимущество такого кода, можно вводить несколько S19,S28,S37 вводи новую константу и вперёд. Что удобно и на перспективу добавления. В case такого не построишь, батан был прав.

Код читается и понимается легко, можно добавлять новое, что очень важно.

Остаётся решить проблему, почему обрезается байт в с19 и последние строки в с28 и с37 ?
Уверен проблема в math и min Их как то убрать и ввести ограничение по размеру и всё, код рабочий.

Что и требовалось сделать. Жду помощи !

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

Проблема думаю в этих строчках :
Код:
 while fbin.Position < Min(fbin.Size, ranges[j, 1]) do
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges[j, 1] - addr));
Если это исправить , то думаю всё будет отлично.

Вкорячить проверку на нужный размер удалось :

Код:
 
fbin := TFileStream.Create(dlgOpen.FileName, fmOpenRead or fmShareDenyWrite);
if (fbin.Size < 65536) or (fbin.Size >65536)  then
begin
ShowMessage('Не допустимый размер файла ! .');
fbin.Free;
exit;
end;
То совсем шоколадно и задача выполнена. другого и не надо.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
читается и понимается легко
Только опять слишком много одинакового кода.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
в S19 обрезается последний байт
Неверная последняя константа диапазона.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
в S28 и в S37 обрезается последняя строка
Не вижу такого.
Код:
procedure TForm1.btn2Click(Sender: TObject);
type
  TInfo = record
    min_size, max_size: Int64;
    file_format: string[3];
    ext_bytes: byte;
    data_line: string[18];
    termination_line: string[16];
    ranges: array[0..7] of array[0..1] of Int64;
  end;
const
  BYTES_IN_LINE = 16;
  sLineEnd = #13#10;
  info: array[0..2] of TInfo = (
    (
      min_size: 0;
      max_size: Limit16;
      file_format: 's19';
      ext_bytes: 3;
      data_line: 'S1%.2x%.4x%s%.2x' + sLineEnd;
      termination_line: 'S9030000FC' + sLineEnd;
      ranges: (
        ($0000, $06C0),
        ($0870, $1F20),
        ($2080, $3A90),
        ($3DD0, $42C0),
        ($4C60, $58E0),
        ($6030, $73C0),
        ($BAE0, $BF60),
        ($E800, $10000)
      )
    ),
    (
      min_size: Limit16 + 1;
      max_size: Limit24;
      file_format: 's28';
      ext_bytes: 4;
      data_line: 'S2%.2x%.6x%s%.2x' + sLineEnd;
      termination_line: 'S804000000FB' + sLineEnd;
      ranges: (
        ($10020, $103D0),
        ($10470, $10AB0),
        ($11021, $115E0),
        ($11A10, $12660),
        ($13450, $16E50),
        ($19050, $1C600),
        ($2A800, $2D9A0),
        ($70BB0, $80880)
      )
    ),
    (
      min_size: Limit24 + 1;
      max_size: Limit32;
      file_format: 's37';
      ext_bytes: 5;
      data_line: 'S3%.2x%.8x%s%.2x' + sLineEnd;
      termination_line: 'S70500000000FA' + sLineEnd;
      ranges: (
        ($1001B90, $1001F70),
        ($1002010, $1003EB0),
        ($1004490, $10059A0),
        ($1005CE0, $10071E0),
        ($1007F90, $1008710),
        ($10092D0, $100A510),
        ($100CA50, $100E670),
        ($1420230, $1432BB0)
      )
    )
  );
var
  fbin, ftxt: TFileStream;
  s, data_s: string;
  b: TBytes;
  addr: Int64;
  i, j, count, read_count: Integer;
  sum: byte;
begin
  fbin := nil;
  ftxt := nil;
  try
    try
      if ComboBox1.ItemIndex = -1 then
        raise Exception.Create('Не выбран диапазон!');
      if not dlgOpen1.Execute then
        exit;
      fbin := TFileStream.Create(dlgOpen1.FileName, fmOpenRead or fmShareDenyWrite);
      with info[ComboBox1.ItemIndex] do
      begin
        if fbin.Size - 1 < min_size then
          raise Exception.Create('Слишком маленький файл!');
        if fbin.Size - 1 > max_size then
          raise Exception.Create('Слишком большой файл!');
        dlgSave1.Filter := Format('Motorola %s (*.%s)|*.%s|Motorola (*.srec; *.s)|*.srec; *.s', [UpperCase(file_format), file_format, file_format]);
        dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.' + file_format);
        dlgSave1.DefaultExt := file_format;
        if not dlgSave1.Execute then
          exit;
        ftxt := TFileStream.Create(dlgSave1.FileName, fmCreate or fmShareDenyWrite);
        SetLength(b, BYTES_IN_LINE);
        s := 'S00600004844521B' + sLineEnd;
        ftxt.Write(s[1], Length(s));
        for j := Low(ranges) to High(ranges) do
        begin
          if ranges[j, 0] < fbin.Size then
            fbin.Position := ranges[j, 0]
          else
            Break;
          while fbin.Position < Min(fbin.Size, ranges[j, 1]) do
          begin
            addr := fbin.Position;
            read_count := fbin.Read(b[0], Min(BYTES_IN_LINE, ranges[j, 1] - addr));
            count := read_count + ext_bytes;
            sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF;
            data_s := '';
            for i := 0 to read_count - 1 do
            begin
              data_s := data_s + IntToHex(b[i], 2);
              Inc(sum, b[i]);
            end;
            sum := $FF - sum;
            s := Format(data_line, [count, addr, data_s, sum]);
            ftxt.Write(s[1], Length(s));
          end;
        end;
        ftxt.Write(termination_line[1], Length(termination_line));
      end;
      s := 'Файл успешно преобразован и записан.';
      Application.MessageBox(PAnsiChar(s), 'Converter', MB_OK + MB_ICONINFORMATION);
    except
      on E : Exception do
        Application.MessageBox(PAnsiChar(E.Message), 'Converter', MB_OK + MB_ICONERROR);
    end;
  finally
    fbin.Free;
    ftxt.Free;
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.02.2022, 00:52   #219
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Только опять слишком много одинакового кода.
Это да, как иначе, если придётся добавить ещё адреса для S19,S28,S37 как тогда быть ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.02.2022, 00:58   #220
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Неверная последняя константа диапазона.
Вы опять, как всегда правы , редактор сбил с толку , привык что на один байт надо назад , всегда так в цикле делается при обработке файла. И тут выставил.
В ошибка конечно в место того чтоб выставить $10000, выставлял $FFFF вот и касяк.
Но это устраняется так :
Код:
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges[j, 1] + addr));
тогда при выставлении $FFFF, будет корректно.
Я был не прав. Если не выстовлять в константе $FFFF, тогда надо +,, если $10000 то минус.
Разобрался. Вам огромное спасибо !!!
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