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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Если последний адрес хочется включать, то надо еще и:
Код:
while fbin.Position < ranges1[j, 1] + 1 do
Что значит хочется, это обязательно для корректной работы, хотя пока гоняю и без этой строки, пока , корректно. Но тестирую, в глазах уже рябит, но надо .
sergey.serg-72 вне форума Ответить с цитированием
Старый 08.02.2022, 03:39   #242
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
это обязательно для корректной работы
Нет. Диапазоны можно задавать разными способами, включая или не включая границы. А от этого зависит наличие "+1" или смена знака "<" на "<=".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
пока , корректно
Попробуйте задать диапазон [$0, $10], т.е. 17 байт. Последний байт не считается.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.02.2022, 08:53   #243
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Попробуйте задать диапазон [$0, $10], т.е. 17 байт. Последний байт не считается.
Сейчас попробую, но вроде пока всё корректно и с последнем адресом $FFFF.
sergey.serg-72 вне форума Ответить с цитированием
Старый 09.02.2022, 03:28   #244
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Попробуйте задать диапазон [$0, $10], т.е. 17 байт. Последний байт не считается.
Блин ну что тут сказать, с одним только еле , еле разобрались, ещё не всё до конца, сегодня препод усложнил задачу , гонит как бронепоезд ужаленный.
задача новая заключается сделать ещё вкладку на комбобоксе, где включить в решение задачи следующее: У нас файл в 176 байт с конкретной под размер файла адресацией.
Надо теперь добавить не входящие в размер файла адреса. То есть в цикле как есть, поставить условие, если файл равен 176 байтам а адресация выходит за размер, надо в цикле увеличить размер файла и добавить новые адреса. Файл тем самым увеличивается и добавляются новые адреса.
Вкладку сделал адреса файла в 176 байт : start 0 - 03F finish , 50 - 7F , 90 - AF.

далее переходим на удлинение файла старт 0С0 - 0EF, 110 - 15F конец.
Начали файлом в 176 байт на выходе новые адреса и файл уже 352 байта.

Наш старый код
Код:
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
чётко под размер файла и адресацию фиксированный , не позволяет в потоке нарастить файл и добавить новые адреса.

пробую так но не получается
Код:
  var
Stream: TMemoryStream;
p: ^Byte;




p := Stream.Memory;
inc(p, $0);
for i := 1 to 352 do
begin
p^ := $FF;
inc(p);
end;


for j := Low(ranges2) to High(ranges2) 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

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
пытаюсь удленить с начало файл
А зачем файл удлинять, если, как я понял, нужно просто вывести в выходной файл несуществующие диапазоны?
Например, вот так их можно выводить:
Код:
  for j := Low(ranges) to High(ranges) do
  begin
    addr := ranges[j, 0];
    while addr < ranges[j, 1] do
    begin
      read_count := 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 + $FF * read_count;
      sum := $FF - sum;
      data_s := StringOfChar('F', 2 * read_count);
      s := Format(data_line, [count, addr, data_s, sum]);
      ftxt.Write(s[1], Length(s));
      Inc(addr, read_count);
    end;
  end;
Только нужно придумать, как переключиться с диапазонов из файла на диапазоны не из файла.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.02.2022, 05:33   #246
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Только нужно придумать, как переключиться с диапазонов из файла на диапазоны не из файла.
BDA, я сам не допонял (сегодня на паре башка от перемены погоды раскалывалась) я в полудрёме был ,как в наркозе..... Сейчас батан отписал, (тоже сидит решает) не просто удлинить а данные считанные с адреса 0 - 03F записать на адрес 110 - 15F и соответственно данные 110 - 15F на адрес 0150 и так далее это как я понял считать данные с одного адреса, а записывать на другой в сторону большего. Чтоб не переключатся я подумал сделать всё в S28 и как раз захватит всё с остатком. И не парится в переключении S. Вопрос теперь как считать то считаем, но записывать на другие адреса более нижние , да и считывать строго по 32 байта на диапазон. Блин, весь код нам ломает эта задача, я в цейтноте и накауте глубоком.

да, адреса от 0 и в большую сторону, 8 диапазонов как было, просто на адрес считываем строго по 32 байта адреса произвольные . Главное первый 0 адрес 32 байта, записать на адрес 110 - 15F а дальше ниже , размер не важен, главное чтоб 8 диапазонов ухватить и каждый ниже и ниже, размер будет зависить от нашего произвольного диапазона адресов.

Цитата:
Сообщение от BDA Посмотреть сообщение
А зачем файл удлинять, если, как я понял, нужно просто вывести в выходной файл несуществующие диапазоны?
Например, вот так их можно выводить:
Код:
Этот код удлиняет файл а данные не записывает, одни FF идут.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Этот код удлиняет файл а данные не записывает, одни FF идут.
Так откуда же ему взять данные, если в исходном файле рассматриваемого диапазона нет. Вот и пишет FF.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
не просто удлинить а данные считанные с адреса 0 - 03F записать на адрес 110 - 15F
Ну так это совершенно другая задача получилась, чем сообщение назад. Если верно понял, то нужно сохранить несколько диапазонов из файла, меняя их адреса. Если не отслеживать перекрываемость новых диапазонов и не пытаться анализировать, какой тип (s19, s28, s37) нужен, то самое простое решение:
Код:
// добавить в описание диапазона третий параметр (смещение)
TRange = array[0..2] of Int64;
...
        while fbin.Position < ranges[j, 1] do
        begin
          addr := fbin.Position;
          read_count := fbin.Read(b[0], Min(BYTES_IN_LINE, ranges[j, 1] - addr));
          // увеличивать выходной адрес на смещение
          Inc(addr, ranges[j, 2]);
Таким образом, диапазоны будут записываться с новыми адресами. Смещение можно и отрицательное использовать, главное, чтобы не больше, чем начальный адрес диапазона.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.02.2022, 07:46   #248
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
TRange = array[0..2] of Int64;
С этим не понял, совсем я запутался что то , это надо сюда
private
{ Private declarations }
public
{ Public declarations }
end;
type
TBytes = array of Byte;
TRange = array[0..2] of Int64;

И не увидел , а где количество байт 32 в диапазоне.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Так я диапазоны записывал на вскидку в ranges произвольные, а на выходе всё ровно FF.
А, это да. Потому что этот код задумывался только для тех диапазонов, что не вошли в файл, но (как уже сказал):
Цитата:
Сообщение от BDA Посмотреть сообщение
Только нужно придумать, как переключиться с диапазонов из файла на диапазоны не из файла.
То есть надо было правильно его совместить с текущим кодом, который пишет только те диапазоны, которые есть.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Отслеживать перекрываемость это как?
Так я и говорю не отслеживать. Но если неаккуратно задать старые и новые диапазоны, то в выходном файле может оказаться один и тот же адрес несколько раз.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
совсем я запутался что то , это надо сюда
А как вы сейчас храните диапазоны? Я-то отталкиваюсь от своего последнего кода.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
И не увидел , а где количество байт 32 в диапазоне.
Так это проще самому задавать диапазоны длиной 32 байта (если возможны не только такого размера диапазоны).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

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

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

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

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

Нет некорректно не вариант .

Цитата:
Сообщение от BDA Посмотреть сообщение
А как вы сейчас храните диапазоны? Я-то отталкиваюсь от своего последнего кода.
Я со своим старым, первоначальным, мне его пока легче читать и разбираться , от простого, потом к сложному, а храню как в первоначальном ,своём коде
Код:
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)
От этого и плясать. Мне идея пришла в голову , создать ещё ranges 15 скажем в него поместить новые адреса, по которым и будет производится запись. Чтоб передача от считанных данных из ranges передать к ranges15 и записывать в файл. Так проще и понятней вроде, но как это реализовать , вот в чём вопрос?

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