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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Особо не тестировал. Вроде заполняет последним байтом всякие диапазоны
Теперь в массиве ranges на первом месте новый адрес, затем начало и конец диапазона из входного файла. На совести пользователя, чтобы новые диапазоны не пересекались.
BDA здравствуйте ! я особо не тестировал, но на вскидку компилятор сразу заругался на sLineEnd
типа неизвестный идентификатор.... Видимо переменную забыли ввести.
Сейчас как я и подозревал и не зря, новые задачи поставлены вставка куска bin в s19 и кусок s19 в s19. , bin в bin я справился , сейчас сижу над новыми задачами. . Старую задачу с последнем байтом уже провалил, поставил ограничение на размер и этим обошёлся, преподу не понравилось но со скрипом прошло.... Я пробивную силу потерял из за остановки. Сейчас с трудом над новыми задачами сижу. В этом деле (кодировании) я понял, что остановка смерти подобна, теряешь мысль и идеи и трудно возвращаться. Такое вот открытие сделал. Я как на новые задачи переключился всё, к старому трудно вернутся , а то и новые упущу....И так идеи тощие пока, зря паузу я взял....
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.03.2022, 16:16   #312
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Особо не тестировал. Вроде заполняет последним байтом всякие диапазоны
Теперь в массиве ranges на первом месте новый адрес, затем начало и конец диапазона из входного файла. На совести пользователя, чтобы новые диапазоны не пересекались.
И ещё один минус , по заданию надо было , если файл меньше диапазонов, то пустующие диапазоны заполняются последнем байтом, если хватает данных то не заполняет. То есть проверка на размер ещё должна быть. И главное, попробовал всё по инструкции, делает гигантские файлы, которые не открываются, видимо не выходит из цикла и продолжает записывает данные. С sLineEnd; так и не решился момент, не пропускает компилятор, не известный идентификатор....
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.03.2022, 17:03   #313
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
С sLineEnd; так и не решился момент, не пропускает компилятор, не известный идентификатор
Нужно добавить глобальную константу:
Код:
const
  sLineEnd = #13#10;
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
То есть проверка на размер ещё должна быть.
Вместо этого проверяется, удалось ли что-то считать из файла по выбранному адресу.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.03.2022, 16:04   #314
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Нужно добавить глобальную константу:
Да это я уже сделал сразу . С этим понятно .

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

С новыми задачами разберусь и ещё попробую .

Цитата:
Сообщение от BDA Посмотреть сообщение
Вместо этого проверяется, удалось ли что-то считать из файла по выбранному адресу.
BDA , вот на вскидку, Батан прислал диапазоны, под файл размером в 98304 байта расщитаный.
Тогда последний байт не надо добавлять. Но мы обрабатываем файл в 65536 байт , соответственно диапазонов с данными не хватает. Нужно заполнять диапазоны в конце файла , последнем байтом. Прога Батана отлично и корректно справляется с задачей. Ваш код с 0 адреса считывает, а в диапазоне нет 0 адреса в данном случаи и данные идут не с 0 адреса.
На выходе файл батана корректен и открывается в редакторе, Ваш код и файл не открывается (неправильная длина строки) пишет редактор. Файл не только неправильно делается и последней байт не должен быть в середине файла , или в начале. Только в конце файла и если не хватает данных под все диапазоны строго.
Вот диапазоны Батана , я всё сделал правильно , но на выходе неправильный файл.

ranges: array[0..9] of array[0..2] of Integer = (
($01870, $01870, $003FFF),
($04000 , $04000 ,$07FFF ),
($8000 , $08000 , $0BFFF),
($0C000, $0C000 ,$010000 ),
($010000 , $010000 ,$03FFF ),
($018000 , $04000 ,$07FFF ),
($028000, $08000 , $0C000 ),
($038000 , $0C000 , $0FFFF),
($48000, $010000, $013FFF),
($58000 , $014000, $017FFF)

В архиве файлы, бин который надо обработать и два s19 Батана прогой и Вашем кодом.
Сами смотрите что выходит.

Цитата:
Сообщение от BDA Посмотреть сообщение
Вместо этого проверяется, удалось ли что-то считать из файла по выбранному адресу.
И что касается заполнения 000 то это не с начала файла, а первый диапазон.
Вот полный от батана как должно быть и первый диапазон с1870 по 20F0 заполняется 00, далее данные и не достающие до размера файла заполняется последнем байтом 6Е.....
Вложения
Тип файла: rar Тестовые файлы.rar (179.0 Кб, 1 просмотров)
Тип файла: rar Тестовый - Батан -2.rar (54.3 Кб, 1 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
файл гигантского размера на выходе
Потому что выходной файл содержит данные с нулевого адреса и данные для пространства между диапазонами. Я же специально спрашивал, почему в файле нет "дырок" в адресах.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Ваш код и файл не открывается (неправильная длина строки) пишет редактор
Потому что этот код только для S19, а в диапазонах адреса, выходящие за этот предел. Верные диапазоны на совести пользователя, так как никаких проверок при формировании выходного файла не предусмотрено. Вот так выводит в S28 и совпадает с последним файлом:
Код:
procedure write_to_stream(
  ftxt: TFileStream;
  var addr: Int64;
  b: TBytes;
  var saved_count: Integer
);
const
  data_line = 'S2%.2x%.6x%s%.2x' + sLineEnd;
  ext_bytes = 4;
var
  i, count: Integer;
  sum: byte;
  data_s: string;
  s: string;
begin
  count := saved_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 saved_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));
  Inc(addr, saved_count);
  saved_count := 0;
end;

procedure TForm1.btn4Click(Sender: TObject);
const
  BYTES_IN_LINE = 32;
  file_format = 's28';
  termination_line = 'S804000000FB' + sLineEnd;
  ranges: array[0..8] of array[0..2] of Int64 = (
    ($01870, $01870, $020F0),
    ($020F0, $020F0, $08000),
    ($08000, $00000, $04000),
    ($0C000, $0C000, $10000),
    ($18000, $04000, $08000),
    ($28000, $08000, $0C000),
    ($38000, $0C000, $10000),
    ($48000, $10000, $14000),
    ($58000, $14000, $18000)
  );
var
  fbin, ftxt: TFileStream;
  s: string;
  b: TBytes;
  addr, range_end: Int64;
  i, j, read_count, saved_count, new_saved_count: Integer;
  last_byte: byte;
begin
  fbin := nil;
  ftxt := nil;
  try
    try
      if not dlgOpen1.Execute then
        exit;
      fbin := TFileStream.Create(dlgOpen1.FileName, fmOpenRead or fmShareDenyWrite);
      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));
      saved_count := 0;
      last_byte := 0;
      addr := ranges[0, 0];
      range_end := ranges[0, 2] - ranges[0, 1] + ranges[0, 0];
      while addr < range_end do
      begin
        new_saved_count := Min(BYTES_IN_LINE, range_end - addr);
        for i := saved_count to new_saved_count - 1 do
          b[i] := last_byte;
        saved_count := new_saved_count;
        if saved_count = BYTES_IN_LINE then
          write_to_stream(ftxt, addr, b, saved_count)
        else
          Break;
      end;
      for j := 1 to High(ranges) do
      begin
        if (saved_count > 0) and (addr + saved_count <> ranges[j, 0]) then
          write_to_stream(ftxt, addr, b, saved_count);
        if saved_count = 0 then
          addr := ranges[j, 0];
        fbin.Position := ranges[j, 1];
        range_end := ranges[j, 2] - ranges[j, 1] + ranges[j, 0];
        while addr < range_end do
        begin
          read_count := fbin.Read(b[saved_count], Min(BYTES_IN_LINE - saved_count, range_end - addr));
          Inc(saved_count, read_count);
          if read_count > 0 then
          begin
            last_byte := b[saved_count - 1];
            if saved_count < BYTES_IN_LINE then
              Break;
          end
          else
            Break;
          write_to_stream(ftxt, addr, b, saved_count);
        end;
        while addr < range_end do
        begin
          new_saved_count := Min(BYTES_IN_LINE, range_end - addr);
          for i := saved_count to new_saved_count - 1 do
            b[i] := last_byte;
          saved_count := new_saved_count;
          if saved_count = BYTES_IN_LINE then
            write_to_stream(ftxt, addr, b, saved_count)
          else
            Break;
        end;
      end;
      if saved_count > 0 then
        write_to_stream(ftxt, addr, b, saved_count);
      ftxt.Write(termination_line[1], Length(termination_line));
      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 вне форума Ответить с цитированием
Старый 11.03.2022, 17:44   #316
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Потому что этот код только для S19, а в диапазонах адреса, выходящие за этот предел. Верные диапазоны на совести пользователя, так как никаких проверок при формировании выходного файла не предусмотрено. Вот так выводит в S28 и совпадает с последним файлом:
Да, BDA последний делает как надо теперь и заполняет 00 диапазон с 1870 по 20F0 как и должно быть. Теперь понятна ошибка , благодаря Вам, ведь правильно диапазон выходил за S19 вот и файл ломанный получался. Вот момент отловлен . Со вторым всё точно получилось.

А вот первый вариант не делает, это когда надо данные считывать с 1870 не заполняя000 и последним байтом заполнять последние диапазоны. У него в проге две кнопки, одна с 00, вторая с данными. Второй вариант получился, а первый нет. Как я понимаю в первом варианте всё по другому надо ?

Первый вариант он универсальный заполняет последним байтом последние диапазоны. Его можно использовать под любые диапазоны, а второй вариант , только под один пример. Так что первый вариант важнее был.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Как я понимаю в первом варианте всё по другому надо ?
Чтобы все-таки читать первый диапазон, нужно добавить один if и пару новых переменных:
Код:
if fill_first_range_with_zeros then // тут можно использовать чекбокс
begin
  addr := ranges[0, 0];
  range_end := ranges[0, 2] - ranges[0, 1] + ranges[0, 0];
  while addr < range_end do
  begin
    new_saved_count := Min(BYTES_IN_LINE, range_end - addr);
    for i := saved_count to new_saved_count - 1 do
      b[i] := last_byte;
    saved_count := new_saved_count;
    if saved_count = BYTES_IN_LINE then
      write_to_stream(ftxt, addr, b, saved_count)
    else
      Break;
  end;
  first_read_range := 1;
end
else
  first_read_range := 0;
for j := first_read_range to High(ranges) do
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
заполняет последним байтом последние диапазоны
Так и этот код заполняет так.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.03.2022, 23:51   #318
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Чтобы все-таки читать первый диапазон, нужно добавить один if и пару новых переменных:
Не понял совсем, как тут чек -бокс , какие переменные и где менять код ?

Но вот диапазон точно надо менять :$01870, $01870, $003FFF),

Цитата:
Сообщение от BDA Посмотреть сообщение
Так и этот код заполняет так.
Да, но не читает диапазон.

Цитата:
Сообщение от BDA Посмотреть сообщение
end
else
first_read_range := 0;
for j := first_read_range to High(ranges) do
Компилятор в ошибку уходит , не нравится end

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Не понял совсем, как тут чек -бокс
Чтобы не копировать один и тот же код в две кнопки, можно оставить одну кнопку и добавить чекбокс, который будет означать, нужно ли читать первый диапазон или заполнять нулями.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
какие переменные
fill_first_range_with_zeros и first_read_range.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
где менять код
Пару сообщений назад был полный код для кнопки. В него был добавлен if и чуть изменен цикл (измененная часть кода и была приведена).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
диапазон точно надо менять
Если и диапазон нужен другой, то, наверное, стоит вынести весь код заполнения файла в новую процедуру, а затем вызывать её с разным списком диапазонов из обработчиков разных кнопок на форме.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Да, но не читает диапазон.
Вот я и предлагаю добавить if, который отключает заполнение нулями первого диапазона и добавляет чтение первого диапазона.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
не нравится end
Если именно end не нравится, то где-то выше был потерян begin.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.03.2022, 15:55   #320
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Чтобы не копировать один и тот же код в две кнопки, можно оставить одну кнопку и добавить чекбокс, который будет означать, нужно ли читать первый диапазон или заполнять нулями.
В том то и дело что по заданию должны были идти 2 кнопки , а не чекс -бокс.
Каждая кнопка своя процедура. И у батана всё верно, как и должно было, ровно 2 кнопки, каждая под свою процедуру. В этом и была суть задания.

Цитата:
Сообщение от BDA Посмотреть сообщение
fill_first_range_with_zeros и first_read_range.
С переменными понятно.

Цитата:
Сообщение от BDA Посмотреть сообщение
Пару сообщений назад был полный код для кнопки. В него был добавлен if и чуть изменен цикл (измененная часть кода и была приведена).
В том то и дело что тот код для одной кнопки, а использовать чекс-бокс в задании нельзя, надо чтоб были 2 кнопки, а не чекс-бокс.

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Если и диапазон нужен другой, то, наверное, стоит вынести весь код заполнения файла в новую процедуру, а затем вызывать её с разным списком диапазонов из обработчиков разных кнопок на форме.
Да,наверное можно так, но диапазон какойто один должен быть, а не несколько. Естественно чтоб диапазон отличался от Батановского. А то слишком было бы понятно.

Цитата:
Сообщение от BDA Посмотреть сообщение
Если именно end не нравится, то где-то выше был потерян begin.
Да, где то потерян , это факт.

Последний раз редактировалось BDA; 15.03.2022 в 22:51.
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