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

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

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

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

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

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

Код:
ranges: array[0..7] of array[0..2] of Integer = (
    // start addr, end addr, offset
    ($0000, $06C0, $10),
    ($0870, $1F20, $20),
    ($2080, $3A90, $30),
    ($3DD0, $42C0, $40),
    ($4C60, $58E0, $50),
    ($6030, $73C0, $60),
    ($0BAE0, $BF60, $70),
    ($0E800, $FFFF, $80)
);
...
// увеличивать выходной адрес на смещение
Inc(addr, ranges[j, 2]);
А если не хочется самому считать смещение, то можно поместить третьим числом новый начальный адрес, а в коде сделать:
Код:
offset := ranges[j, 2] - ranges[j, 0];
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, offset);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.02.2022, 06:39   #252
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А если не хочется самому считать смещение, то можно поместить третьим числом новый начальный адрес, а в коде сделать:
Смещение это новый адрес, на который будут записаны считанные данные правильно?
Третье число , это третье значение типа $10, можно сюда поместить адрес с которого начинать запись ? Это круто.
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.02.2022, 06:44   #253
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
offset := ranges[j, 2] - ranges[j, 0];
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));
// увеличивать выходной адрес на смещение



Цитата:
Сообщение от BDA Посмотреть сообщение
offset := ranges[j, 2] - ranges[j, 0];
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, offset);


А будем делать , на случай обрезанного файла , на один байт и когда последний адрес не помещается, как делали ?
Код:
 if ranges6[j, 0] < fbin.Size then
fbin.Position := ranges6[j, 0]
else
Break;
if ranges6[j, 1] > fbin.Size then
Break;
while fbin.Position < ranges6[j, 1] do
offset добавить в переменную Integer;
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.02.2022, 07:04   #254
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Смещение это новый адрес, на который будут записаны считанные данные правильно?
Смещение это смещение, а новый адрес это новый адрес (старый адрес + смещение = новый адрес). Можно записывать в массив ranges смещение, можно новый адрес , просто нужно соответственно его использовать.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А будем делать , на случай обрезанного файла , на один байт и когда последний адрес не помещается, как делали ?
Не понял вопрос.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.02.2022, 08:50   #255
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
if ranges6[j, 0] < fbin.Size then
fbin.Position := ranges6[j, 0]
else
Break;
if ranges6[j, 1] > fbin.Size then
Break;
while fbin.Position < ranges6[j, 1] do
Цитата:
Сообщение от BDA Посмотреть сообщение
Не понял вопрос.


Я имел ввиду код обработки, если файл меньше адреса последнего .

Который мы использовали
Код:
 if ranges6[j, 0] < fbin.Size then
fbin.Position := ranges6[j, 0]
else
Break;
if ranges6[j, 1] > fbin.Size then
Break;
while fbin.Position < ranges6[j, 1] do
sergey.serg-72 вне форума Ответить с цитированием
Старый 10.02.2022, 08:53   #256
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Смещение это смещение, а новый адрес это новый адрес (старый адрес + смещение = новый адрес). Можно записывать в массив ranges смещение, можно новый адрес , просто нужно соответственно его использовать.
Ну да, я понял выставил адрес и зависла программа .....

($0000, $06C0, $3000),- типа сюда записать и так и другие произвольно.

И с Вашими адресами зависает программа, приходится принудительный сброс делать.
Виснет жёстко.

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

Цитата:
Сообщение от BDA Посмотреть сообщение
ranges: array[0..7] of array[0..2] of Integer = (
// start addr, end addr, offset
($0000, $06C0, $10),
($0870, $1F20, $20),
($2080, $3A90, $30),
($3DD0, $42C0, $40),
($4C60, $58E0, $50),
($6030, $73C0, $60),
($0BAE0, $BF60, $70),
($0E800, $FFFF, $80)
Зависает жёстко и всё . пока не сбросишь.Что то не нравится в цикле думаю.
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.02.2022, 00:06   #258
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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


Код:
ranges: array[0..7] of array[0..2] of Integer = (
    // start addr, end addr, offset
    ($0000, $06C0, $10),
    ($0870, $1F20, $20),
    ($2080, $3A90, $30),
    ($3DD0, $42C0, $40),
    ($4C60, $58E0, $50),
    ($6030, $73C0, $60),
    ($0BAE0, $BF60, $70),
    ($0E800, $FFFF, $80)
);
...
// увеличивать выходной адрес на смещение
Inc(addr, ranges[j, 2]);
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.02.2022, 01:37   #259
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Зависает жёстко и всё
Я не добавлял исправления и не запускал у себя, но, скорее всего, вы разместили Inc(addr, ranges[j, 2]) не в том месте. Нужно его поместить после fbin.Read.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.02.2022, 02:27   #260
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Я не добавлял исправления и не запускал у себя, но, скорее всего, вы разместили Inc(addr, ranges[j, 2]) не в том месте. Нужно его поместить после fbin.Read.
да. нет разместил вроде правильно, всё ровно смещение не верно делает, первое правильно , со 2 по 5 неправильно. И главное . если эту строчку Inc(addr, ranges[j, 2]) файл не удлиняется под конечный адрес. Если эту Inc(addr, offset); то Удлиняется под размер последнего адреса.
Но в том и том варианте и вместе, смещение не соответствует прописанному.

Код:
 for j := Low(ranges) to High(ranges) do
begin
offset := ranges[j, 2] - ranges[j, 0];
while fbin.Position < ranges[j, 1] do 

begin
addr := fbin.Position;
read_count := fbin.Read(b[0], Min(BYTES_IN_LINE, ranges[j, 1] +1));
Inc(addr, ranges[j, 2]);
//Inc(addr, offset);
И куда, тогда эту строчку Inc(addr, offset);?
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