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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
На мой взгляд, пара лишних чисел в данных всё равно лучше, чем дублирование кода.
Так я и не спорю , хотя лучше бы было в любой момент любые диапазоны при необходимости и без пустышек и без дублирования конечно кода.
Вот типа процедуры, или функции и тогда сам код и сохранение не дублировать.
Этот вариант (мой) тоже сгодится ребятам на списалки, чтоб не у всех одинаково.....
Оба кода найдут применение, если исголюсь может третий, как нибудь смастырю, на списалки.
А Ваш себе, естественно оставлю.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.02.2022, 07:06   #232
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вот типа процедуры, или функции и тогда сам код и сохранение не дублировать.
Да, так будет лучше. Вместо массива info вынести весь код в отдельную процедуру, сделав все поля TInfo параметрами этой процедуры. Тогда для диапазонов можно будет использовать открытый массив, перечисляя необходимое количество диапазонов.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А с этим кодом просто пустой файл, хотя 6 из 8 диапазонов можно считать и нужно.
С этим кодом и вашим тестовым файлом у меня записалось 7 из 8 диапазонов, а отбросился только последний.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.02.2022, 08:20   #233
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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


Я правильно понимаю что цикл while fbin.Position < ranges4[j, 1] do, за место , while fbin.Position < Min(fbin.Size, ranges4[j, 1]) do , потому как и с одним работает и с другим корректно, но два ведь не оставишь .
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.02.2022, 08:30   #234
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
потому как и с одним работает и с другим корректно, но два ведь не оставишь
Новый if гарантирует, что ranges4[j, 1] меньше или равен fbin.Size перед этим циклом, поэтому нет смысла делать Min.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.02.2022, 10:43   #235
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, так будет лучше. Вместо массива info вынести весь код в отдельную процедуру, сделав все поля TInfo параметрами этой процедуры. Тогда для диапазонов можно будет использовать открытый массив, перечисляя необходимое количество диапазонов.
это только с Вашей помощью, для меня пока сложно.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.02.2022, 10:45   #236
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Новый if гарантирует, что ranges4[j, 1] меньше или равен fbin.Size перед этим циклом, поэтому нет смысла делать Min.
Я так и сделал, оттестил всё вроде, вот теперь отлично и можно к Вашему переходить , дорабатывать. Но только с Вами.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.02.2022, 11:45   #237
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
для меня пока сложно
Примерно так:
Код:
// добавил тип
type
  TRange = array[0..1] of Int64;
...
// добавил метод форме
  TForm1 = class(TForm)
...
    procedure ConvertBin2Srec(
      file_format, data_line, termination_line: string;
      min_size, max_size: Int64;
      ext_bytes: byte;
      const ranges: array of TRange
    );
...
// добавил функцию
function RangeCreate(a, b: Int64): TRange;
begin
  Result[0] := a;
  Result[1] := b;
end;

// добавил метод
procedure TForm1.ConvertBin2Srec(
  file_format, data_line, termination_line: string;
  min_size, max_size: Int64;
  ext_bytes: byte;
  const ranges: array of TRange
);
begin
  // тут практически весь старый код по конвертации Bin в Srec
end;

// вызов с нужными параметрами
procedure TForm1.btn3Click(Sender: TObject);
begin
  case ComboBox1.ItemIndex of
    -1: ShowMessage('Не выбран диапазон!');
    0:
      ConvertBin2Srec(
        's19', 'S1%.2x%.4x%s%.2x' + sLineEnd, 'S9030000FC' + sLineEnd,
        0, Limit16, 3,
        [
          RangeCreate($0000, $06C0),
          RangeCreate($0870, $1F20),
          RangeCreate($2080, $3A90),
          RangeCreate($3DD0, $42C0),
          RangeCreate($4C60, $58E0),
          RangeCreate($6030, $73C0),
          RangeCreate($BAE0, $BF60),
          RangeCreate($E800, $10000)
        ]
      );
    // 1:; тут остальные нужно описать
    // 2:; тут остальные нужно описать
  else
    ShowMessage('Неизвестный диапазон!');
  end;
end;
К сожалению, не придумал, как отказаться от RangeCreate, кроме как перейти на одномерный массив.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.02.2022, 03:39   #238
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
К сожалению, не придумал, как отказаться от RangeCreate, кроме как перейти на одномерный массив.
Да, трудновато будет , тут неделю разбираться только......

А я опять, отловил у нас недочёт , в S19 у нас диапазон от 0 до 65536 байт так?
Так вот , если адрес последний не входят в диапазон , то останавливаемся на пред последнем.
А теперь попробуйте байт один в редакторе убрать, чтоб стало 65535 и код обработки не сработает и перескачет и будет не полный последний адрес, что неправильно, если 65536, или 65534 срабатывает, а вот если 65535 то проскакивает, а не должен проскакивать. Один байт от неполных 65536 и всё, код не работает. Не ставить ведь на 65534 ?
И адреса менял и +1 и -1 бестолку, либо байт отрезает от нужного диапазона при конвертации , либо проскакивает и не останавливается на предпоследнем диапазоне. В общем касяк . Я и $10000 и $FFFF выставлял, бестолку всё. Почему не видет и пропускает один байт 65535 ?
Разбираюсь. Ограничение стоит до 65536 максимально, но при 65535 проскакивает и последний диапазон получается неверный.
sergey.serg-72 вне форума Ответить с цитированием
Старый 07.02.2022, 04:46   #239
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
Счастье

Кажись нашёл , маленький огрех, а столько сил и тестов.... Не учли момент .
Сделал так и всё пока нормально, но тестить по новому придётся

.
Код:
 begin
if ranges1[j, 0] < fbin.Size then
fbin.Position := ranges1[j, 0]
else
Break;
if ranges1[j, 1] > fbin.Size -1 then
Break;
while fbin.Position < ranges1[j, 1] do

Код:
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges1[j, 1] +1 - addr )) ;
при конечном адресе ; $FFFF

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
при конечном адресе $FFFF
Если последний адрес хочется включать, то надо еще и:
Код:
while fbin.Position < ranges1[j, 1] + 1 do
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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