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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Не в цикле. Сначала вынести этот новый код, который пишет нули, например, перед циклом "for j := Low(ranges3) to High(ranges3) do" (можно и после цикла, зависит от желаемого результата). Потом в новом коде поменять j на 0, чтобы использовать информацию о первом диапазоне.
Сделал так
Код:
 s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));


 addr := ranges3[0, 0];
  while addr < ranges3[0, 1] do
  begin
    read_count := Min(BYTES_IN_LINE, ranges3[0, 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 + $00 * read_count;
    sum := $FF - sum;
    data_s := StringOfChar('0', 2 * read_count);
    s := Format(data_line, [count, addr, data_s, sum]);
    ftxt.Write(s[1], Length(s));
    Inc(addr, read_count);
  end;
  fbin.Position :=ranges3[0, 0];
  offset :=ranges3[0, 2] - ranges3[0, 0];
  while fbin.Position < ranges3[0, 1] do
  begin
    addr :=fbin.Position;
    read_count := fbin.Read(b[0], min(BYTES_IN_LINE, ranges3[0, 1]-addr));
    Inc(addr, offset);
  end;

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

begin
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges3[j, 1]+1 -addr));
Inc(addr, offset);
count := read_count + ext_bytes;
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(data_line, [count, addr, data_s, sum]);
ftxt.Write(s[1], Length(s));
end;
end;
ftxt.Write(termination_line[1], Length(termination_line));
MessageBox(handle,PChar(' Файл сконвертирован и записан !'+#13#10), PChar('сообщение'), 64);
fbin.Free;
ftxt.Free;
exit;
end;
end;
end;
Нули пишет от 0 адреса , а дойдя до 800 на который должен писать пишет FF,
По конкретному адресу 800 не пишет.
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.02.2022, 09:50   #292
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
if Edit2.Text = '' then
Супер сработало ! только почему сендер не сработал, загадка .....
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.02.2022, 11:20   #293
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Этот код лишний:
Код:
  fbin.Position :=ranges3[0, 0];
  offset :=ranges3[0, 2] - ranges3[0, 0];
  while fbin.Position < ranges3[0, 1] do
  begin
    addr :=fbin.Position;
    read_count := fbin.Read(b[0], min(BYTES_IN_LINE, ranges3[0, 1]-addr));
    Inc(addr, offset);
  end;
"+ $00 * read_count;" для нулей это можно не прибавлять (N + 0 = N).
"read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges3[j, 1]+1 -addr));" +1 не нужен.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Нули пишет от 0 адреса , а дойдя до 800 на который должен писать пишет FF
Что именно сейчас в ranges3?
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
только почему сендер не сработал
А почему должен был сработать?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.02.2022, 23:42   #294
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Этот код лишний:
Код:
fbin.Position :=ranges3[0, 0];
offset :=ranges3[0, 2] - ranges3[0, 0];
while fbin.Position < ranges3[0, 1] do
begin
addr :=fbin.Position;
read_count := fbin.Read(b[0], min(BYTES_IN_LINE, ranges3[0, 1]-addr));
Inc(addr, offset);
end;
"+ $00 * read_count;" для нулей это можно не прибавлять (N + 0 = N).
"read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges3[j, 1]+1 -addr));" +1 не нужен.
Убрал всё лишнее, но продолжаются 0 с 0 адреса, а к 800 FF.

Цитата:
Сообщение от BDA Посмотреть сообщение
Что именно сейчас в ranges3?
Сейчас вот так :
Код:
  ($0000, $06C0, $800),
    ($0870, $1F20, $900),
    ($1080, $3A90, $1020),
    ($3DD0, $42C0, $1500),
    ($4C60, $58E0, $1800),
    ($6030, $73C0, $1860),
    ($0BAE0, $BF60, $1920),
    ($0E800, $FFFF, $2000)
Цитата:
Сообщение от BDA Посмотреть сообщение
А почему должен был сработать?
как почему? код на срабатывание, а он не срабатывал.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Сейчас вот так
Простая тестилка диапазонов:
Код:
procedure TForm1.btn1Click(Sender: TObject);
const
  ranges: array[0..7] of array[0..2] of Integer = (
    ($0000, $06C0, $800),
    ($0870, $1F20, $900),
    ($1080, $3A90, $1020),
    ($3DD0, $42C0, $1500),
    ($4C60, $58E0, $1800),
    ($6030, $73C0, $1860),
    ($0BAE0, $BF60, $1920),
    ($0E800, $FFFF, $2000)
  );
var
  i, j, offset_i, offset_j: integer;
begin
  with mmo1 do
  begin
    Clear;
    Lines.BeginUpdate;
    for i := Low(ranges) to High(ranges) do
    begin
      offset_i := ranges[i, 2] - ranges[i, 0];
      for j := i + 1 to High(ranges) do
      begin
        offset_j := ranges[j, 2] - ranges[j, 0];
        if (ranges[i, 1] > ranges[j, 0]) and (ranges[i, 0] < ranges[j, 1]) then
          Lines.Add(Format('old %d intersects old %d', [i, j]));
        if (ranges[i, 1] > ranges[j, 0] + offset_j) and (ranges[i, 0] < ranges[j, 1] + offset_j) then
          Lines.Add(Format('old %d intersects new %d', [i, j]));
        if (ranges[i, 1] + offset_i > ranges[j, 0]) and (ranges[i, 0] + offset_i < ranges[j, 1]) then
          Lines.Add(Format('new %d intersects old %d', [i, j]));
        if (ranges[i, 1] + offset_i > ranges[j, 0] + offset_j) and (ranges[i, 0] + offset_i < ranges[j, 1] + offset_j) then
          Lines.Add(Format('new %d intersects new %d', [i, j]));
      end;
    end;
    Lines.EndUpdate;
  end;
end;
mmo1 это TMemo. У диапазонов (старых и новых) куча пересечений между собой. Если вы ищете и проверяете правильность данных просто по адресу, то, может быть, смотрите не на те данные, т.к. для одного адреса будет несколько записей.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
код на срабатывание, а он не срабатывал.
Аналогия такая. Вы хотите проверить, что тарелка пустая, а проверяете: входная дверь не заперта И тарелка пустая. Проверка сендера никак не относится к пустоте эдита.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.02.2022, 10:35   #296
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
mmo1 это TMemo. У диапазонов (старых и новых) куча пересечений между собой. Если вы ищете и проверяете правильность данных просто по адресу, то, может быть, смотрите не на те данные, т.к. для одного адреса будет несколько записей.
Круто, то что надо ,BDA Вы гений !
sergey.serg-72 вне форума Ответить с цитированием
Старый 16.02.2022, 10:36   #297
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
как почему? код на срабатывание, а он не срабатывал.
Разобрался в этом моменте но опять, благодаря Вам !
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.02.2022, 00:18   #298
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Простая тестилка диапазонов:
BDA , а вот и недостаток выяснился , батан прислал диапазон вот этот
Код:
 const
ranges: array[0..1] of array[0..2] of Integer = (  
      ($0000, $0FB9, $17FF ),
       ($0FBA, $F78D, $0FFFF)
);
И мина получается , файл с неполной строкой, получается и код наш не останавливается на адресе конечном FFFF а проскакивает до 1E7D3 и что странно конструкция не останавливает выход за диапазон. Причина думаю в неполной строке файла и смещение не учитывается.
Как такое возможно ?
Код:
for j := Low(ranges) to High(ranges) do
begin
if ranges[j, 1] > fbin.Size then
Break;
fbin.Position := ranges[j, 0];
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, ranges2[j, 1] + 1 - addr)); 
Inc(addr, offset);
И ещё неправильно конвертирует и ошибка открытия
Изображения
Тип файла: jpg 1.JPG (7.9 Кб, 19 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
ошибка открытия
Предположу, что не поддерживаются неполные строки той программой, которой открываете.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
код наш не останавливается на адресе конечном FFFF
А почему он должен останавливаться, если конец второго диапазона после переноса 1E7D2.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
ranges2[j, 1] + 1 - addr
Опять единица лишняя.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.02.2022, 02:17   #300
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Предположу, что не поддерживаются неполные строки той программой, которой открываете.
исключено , редактор тритона , всё открывает. Батан какой то ребус дал с таким диапазоном.
Редактор не при чём.
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