Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

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

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

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2021, 13:49   #21
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
ак попробуйте сделать именно так.
evg_m Евгений ай да Вы молодец !!! я сразу не въехал, сейчас дел навалилось , совсем голова кругом .... Вы правы , ошибку допустил и не проверил хорошо , не протестировал сразу....
Всё исправил и огромное Вам спасибо ! что дважды указывали, а я только сейчас въехал...
Теперь можно в любую директорию сохранять и изменить имя при сохранении, если не устраивает.
Вот так надо :
Код:
ftxt.SaveToFile(dlgSave1.FileName+'' + '.txt');
Цитата:
Сообщение от Alar Посмотреть сообщение
А во факту форум даже с оплаты сервера платит НДС, и финансирует ваше образование.
А куда слать денежку и сколько ?

Цитата:
Сообщение от BDA Посмотреть сообщение
Теперь по поводу контрольной суммы. Не вижу особого смысла в отдельной функции. Посмотрите внимательно на код в 18 сообщении и код функции CalcSum и найдите одинаковый цикл. Необходимые изменения в коде 18 сообщения:
Завести переменную типа Byte;
Обнулить её перед циклом (найденный ранее);
Затем дополнить тело цикла операторными скобками begin и end;
BDA , Вы правы оказались функция не нужна.
Как не старался, по Вашей инструкции не вышло.
Пошёл другим путём, получилось всё , подсчитывает и проставляет.
Но не так , как Вы описали.
Проверьте мой код пожалуйста ! что не так я сделал.
Хотя всё делает корректно, я проверил, но не так, как вы описали.
Интересно Ваше решение.

Код:
 sum : byte;

sum:=0;
begin
for i := 0 to count - 1 do
S :=s + ' ' + IntToHex(b[i],2);
end;
for i := 0 to count - 1 do
Sum:=Sum+ b[i];
S :=s + ' ' + IntToHex(Sum,2);
s := s + sLineBreak;
ftxt.Write(s[1], Length(s));
end;
begin
dlgsave1.Filter:= 'Txt File (*.Txt)|*.Txt';
dlgSave1.FileName :=dlgOpen1.FileName;
if dlgSave1. Execute() then
begin
ftxt.SaveToFile(dlgSave1.FileName+'' + '.txt');
Application.MessageBox('txt_ файл записан успешно.', Сообщение, MB_Ok + MB_ICONINFORMATION);
end;
end;
fbin.Free;
ftxt.Free;
end;
end;
end.
p/s
А сколько я должен за помощь ? могу на телефон скинуть денежку.

Последний раз редактировалось BDA; 14.03.2021 в 06:36.
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.03.2021, 19:15   #22
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,269
По умолчанию

Ну да, я имел ввиду так:
Код:
sum := 0;
for i := 0 to count - 1 do
begin
  s := s + ' ' + IntToHex(b[i], 2);
  sum := sum + b[i]; // или Inc(sum, b[i]);
end;
s := s + ' ' + IntToHex(sum, 2) + sLineBreak;
ftxt.Write(s[1], Length(s));
Получилось одно и то же в выходном файле, просто цикл только один раз проходит вместо двух.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.03.2021, 23:19   #23
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

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

Я уже отправил преподу свою , точней коллективную поделку, всё делает как в задании было назначено. А препод убил на повал, всё говорит хорошо, но надо дополнить , теперь со смещением запись что бы , как я понял через edit задаём адрес например : 0000040 и чтоб запись производить на этот адрес, короче на выбор пользователя. Не с 0 как у нас, а чтоб была возможность задавать адрес записи. Я с трудом представляю как это?
Типа OFFSET , препод сказал что это легко, но для него видимо легко, а я рухнул...
Говорит это для следующей темы, которую будем проходить и там будет задание серьёзное, а это тренировка учебная.... Блин, я думал закончили, а теперь головняк опять.

Сижу ищу в инете материал, нет ни чего даже близко по теме.
Как это смещение производится ?

Как я понимаю раз через edit задаётся, значит
начинать надо так : fbin.Position:=Strtoint('$' + Edit1.Text); fbin.Seek(0, soFromBeginning);
Но тогда рушится вся конструкция цикл : while fbin.Position < fbin.Size do это логический цикл и он явно не подходит для смещения, надо менять , а как не могу сообразить.
BDA, натолкните на мысль пожалуйста, может где есть такая тема, или пример?
Я такого не делал ни разу и пока в инете, не нарыл ни чего.

Последний раз редактировалось sergey.serg-72; 05.03.2021 в 23:22.
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.03.2021, 23:48   #24
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,269
По умолчанию

Если нужно получить txt, в котором входной bin лег с выбранного адреса, а не с нуля. То завести переменную offset, записать в нее значение из Edit1, а затем в строку s писать:
Код:
s := Format('%.8x :', [fbin.Position + offset]);
Думаю, что следующим этапом преподаватель скажет выровнять адреса в выходном файле по 16 байтам.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.03.2021, 17:21   #25
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Думаю, что следующим этапом преподаватель скажет выровнять адреса в выходном файле по 16 байтам.
BDA , огромное спасибо ! я неправильно изначально мыслил и не в том направлении конечно переменная Offset : integer;
Всё внёс , всё отлично , отправил преподу, он вернул мне, для исправления.

Проблема в ошибку выпадала, если адрес в edit не введён....
Вы правы оказались, отладка и тестирование, это пожалуй самое важное.
Я поторопился и мне вернули на дороботку.
Всё исправил отправил, принято , но препод требует объяснить почему и что означает предупреждение при компеляции : [Предупреждение] Unit1.pas(73): Unsafe code 'String index to var param'
В остальном всё принято и зачтено.
Что внёс :
Код:
 if (Sender = SpeedButton1) and (EDit1.Text = '')  then
begin
Application.MessageBox('Введите  адрес, с которого производить запись в файл  !', 'Hex', MB_Ok + MB_ICONINFORMATION);
exit;
end;
Далее обработка edit :

Код:
 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', 'A'..'F','a'..'f',#8]) then
Key := #0;
end;
procedure TForm1.Edit1Click(Sender: TObject);
begin
LoadKeyboardLayout('00000409', KLF_ACTIVATE);
end;

Думаю, что следующим этапом преподаватель скажет выровнять адреса в выходном файле по 16 байтам.

Нет, ни чего по этому поводу не сказал, только объяснить предупреждение при компиляции .
Но я учёл Ваше пожелание и сделал выравнивание.Это Вы имели ввиду?
Прога в архиве, посмотрите, может чего не учёл?
Вложения
Тип файла: rar Converter_.rar (454.8 Кб, 2 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.03.2021, 18:50   #26
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

sergey.serg-72,

Вот код полностью и исходники как и обещал , может кому пригодится .


Код:
 Type  //Определяет новую категорию переменной
 или процесса
 
TBytes = array of Byte;  //  создаём тип данных в виде массива байт 


const        // объявляем константу   //используется для начала раздела постоянных определений. 
BYTES_IN_LINE = 16;
var
fbin: TMemoryStream;       // класс  обеспечивает сохранение данных в адресном пространстве. 
ftxt: TMemoryStream;       // при работе с файловыми потоками.
s: string;
b: TBytes;
i, count, offset: integer;
sum : byte;
begin
if (Sender = SpeedButton1) and (EDit1.Text = '')  then   // обработка,  если поле ввода адреса записи пустое 
begin
Application.MessageBox('Введите  адрес, с которого производить запись в файл  !', 'Converter  ', MB_Ok + MB_ICONINFORMATION);
exit;
end;
dlgOpen1.Filter := ' (*.bin)|*.bin';     / / фильтр для работы с определённым форматом
if dlgOpen1.Execute then
begin
fbin := TMemoryStream.Create;      // создаём объект в памяти 
ftxt := TMemoryStream.Create;
fbin.LoadFromFile(dlgOpen1.FileName);      //   загружаемый  файл 
SetLength(b, BYTES_IN_LINE);             // загружаем в массив константу и массив  типа byte
while fbin.Position < fbin.Size do          //  циклом определяем  позицию начальный   адрес чтения данных из файла
begin
offset:= Strtoint('$' + Edit1.Text);        //  задать адрес записи в файл с помощью edit 
s := Format('%.8x :', [fbin.Position + offset]);    // переменой s типа string присваиваем формат отображения адреса, позиции 
count := fbin.Read(b[0], BYTES_IN_LINE);     // читаем файл в массив по 16 байтв  в строке определено константой 
sum:=0;
for i := 0 to count - 1 do        // через цикл читаем файл от начало и до конца 
begin
 s := s + ' ' + IntToHex(b[i], 2);     // переводим, конвертируем данные в HEX  и присваеваем  переменной s
 sum := sum + b[i]; // или так  Inc(sum, b[i]);    //  подсчитываем контрольную сумму строки  (один байт )
end;
s := s + ' ' + IntToHex(sum, 2) + sLineBreak;       / / переводим байт контрольной суммы в hex + константа sLineBreak  перенос строки 
ftxt.Write(s[1], Length(s));       // записываем массив данных в файл txt 
end;
begin
dlgsave1.Filter:= 'Txt File (*.Txt)|*.Txt';   // фильтр сохранения 
dlgSave1.FileName :=dlgOpen1.FileName;    //  при сохранении файла даём имя загруженого файла
if dlgSave1. Execute() then      // открываем окно сохранения файла и даём возможность сохранить в любую директорию
begin
ftxt.SaveToFile(dlgSave1.FileName+'' + '.txt');    // сохраняем записанный файл .txt'
Application.MessageBox('txt_ файл записан  успешно.', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
end;
end;
fbin.Free;   // закрываем потоки 
ftxt.Free;
end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', 'A'..'F','a'..'f',#8]) then  // обработка edit ввод только в шестнадцатиричном формате 
Key := #0;
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
LoadKeyboardLayout('00000409', KLF_ACTIVATE);  //  переключаем на английский шрифт 
end;
end.
Вложения
Тип файла: rar Converter_rTXT _BIN_.rar (472.5 Кб, 2 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 08.03.2021, 07:59   #27
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,269
По умолчанию

Только сейчас почитал комментарии к коду - не все соответствуют тому, что реально делает код, но раз преподаватель уже зачел, то ладно. Не надо присваивать offset внутри цикла, достаточно один раз перед циклом. С проверкой поля для оффсета не согласен: переключение раскладки на английскую и принятие только символов, соответствующих шестнадцатеричным числам, конечно помогает, но я все равно могу ввести мусор, через вставку текста из буфера правой кнопкой мыши и получить стандартное сообщение об ошибке преобразования. Например, можно пустую строку расценивать как нулевое смещение, а непустую пытаться преобразовать с соответствующим сообщением при неудаче:
Код:
  if Edit1.Text = '' then
    offset := 0
  else
  begin
    offset := StrToIntDef('$' + Edit1.text, -1);
    if offset = -1 then
    begin
      Application.MessageBox('Введен некорректный адрес, с которого производить запись в файл!', 'Converter', MB_Ok + MB_ICONINFORMATION);
      exit;
    end;
  end;
По поводу предупреждения, вот что гласит справка "You have used a data type or operation for which static code analysis cannot prove that it does not overwrite memory. In a secured execution environment such as .NET, such code is assumed to be unsafe and a potential security risk.". Насколько я понимаю, дельфи не может статически проверить, что код не полезет за границы строки. Можно попробовать переписать с использованием TStrings, тогда удастся избежать предупреждения, предположительно. Выравнивание адресов, это не убирание пробелов в выходном файле. Например, выбран адрес $123. Вывод программы без выравнивания (и без контрольной суммы):
Цитата:
00000123: AB CD EF
А с выравниванием адрес будет кратен 16, и появятся лишние нули, чтобы фактически полезные байты оказались на адресе $123:
Цитата:
00000120: 00 00 00 AB CD EF
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.03.2021, 14:02   #28
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Только сейчас почитал комментарии к коду - не все соответствуют тому, что реально делает код, но раз преподаватель уже зачел, то ладно. Не надо присваивать offset внутри цикла, достаточно один раз перед циклом. С проверкой поля для оффсета не согласен: переключение раскладки на английскую и принятие только символов, соответствующих шестнадцатеричным числам, конечно помогает, но я все равно могу ввести мусор, через вставку текста из буфера правой кнопкой мыши и получить стандартное сообщение об ошибке преобразования. Например, можно пустую строку расценивать как нулевое смещение, а непустую пытаться преобразовать с соответствующим сообщением при неудаче:
Да, Вы правы на все 100%, мне уже препод тоже самое, слово, в слово сказал.
Я как раз мучаюсь второй день, как исправить, Вы так во время BDA, огромное спасибо, сейчас всё исправлю.

Цитата:
Сообщение от BDA Посмотреть сообщение
По поводу предупреждения, вот что гласит справка "You have used a data type or operation for which static code analysis cannot prove that it does not overwrite memory. In a secured execution environment such as .NET, such code is assumed to be unsafe and a potential security risk.". Насколько я понимаю, дельфи не может статически проверить, что код не полезет за границы строки. Можно попробовать переписать с использованием TStrings, тогда удастся избежать предупреждения, предположительно. Выравнивание адресов, это не убирание пробелов в выходном файле. Например, выбран адрес $123. Вывод программы без выравнивания (и без контрольной суммы):
Да, объяснение я нашёл на форуме одном, там ещё можно отключить в настройках предупреждение, это как мне объяснили не критически и не заморачиваться , эта трабла Дельфи...
А вот про выравнивание , значит я не прав, а думал что правильно сделал, а как тогда правильно ?

Цитата:
Сообщение от BDA Посмотреть сообщение
А с выравниванием адрес будет кратен 16, и появятся лишние нули, чтобы фактически полезные байты оказались на адресе $123:
Это видимо для форматов srec и intelhex, а у меня получилась просто имитация смещения, я не прав опять.... Вот о чём я говорил, ни в одном материале по Дельфи нет объяснения и примеров, как хочешь , так и разбирайся..., А Вы говорите медвежья услуга, не согласен, медвежья это для профи, а для лузера наглядное пособие в примере, а то сидишь днями, ищешь примеры, а их нет, а не все одарённые программисты, чтоб самим догадаться..
Вот не дали бы Вы пример наглядный, что делать? три варианта : 1) списать у кого то, ( я даю лично списывать ) но проблема, тупо списал и не понял что и как делать... 2)получить не за чёт и послать всё на фиг это кодирование.... ну и ещё третий вариант заказ программы за деньги.
К стате к этому варианту скоро придётся обратится по любому, в переди тема для меня не подъёмная будет и мне не справится, как и многим другим. Но тут проблема,написали за деньги , а объяснять преподу что и как делается в коде ? , если я не понимаю, как я объяснять буду , то , что не понимаю? Заплатил, написали, сдал предположим. А чему тогда сам научился?, если сам не понимаю что и как делал программист? Будет ли он подробно расписывать, по шагово, что и как делает в программе? я сомневаюсь... А надо не просто , тупо написать, а и понимать надо.
Так что медвежья , для кого , как.
Я готов оплатить за помощь, как и говорил, готов хоть на телефон скинуть Вам деньгу.

Последний раз редактировалось BDA; 14.03.2021 в 06:37.
sergey.serg-72 вне форума Ответить с цитированием
Старый 08.03.2021, 15:06   #29
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

sergey.serg-72,

BDA, вот тут попробовал сделать через запятую данные и в верхушку добавить шапку типа как в SREC , но не выходит. Я уже понимаю что через две недели препод даст задание, либо по srec, либо по intelhex, вот тренируюсь так сказать.
С запятой выходит не красиво как то, где не надо ставит запятую, где надо не ставит.
И попробовал шапку типа :S0030000FC,
И в засаду попал. Чтоб сделать шапку, как я понимаю надо завести переменную типа string и присвоить ей так G :=' :S0030000FC,'
Теперь вопрос в другом раз шапка, значит вверху должна быть . Значит надо как то в цикл включать перед основной записью в файл.
И с запятыми не понятка ,
Код:
 sum:=0;
for i := 0 to count - 1 do
begin
 s := s + ', ' + IntToHex(b[i], 2);
 sum := sum + b[i]; // или так  Inc(sum, b[i]);
end;
s := s + ', ' + IntToHex(sum, 2) + sLineBreak;
ftxt.Write(s[1], Length(s));
end;
Так ставит запятые но не правильно.

И как шапку сделать в начале записи данных.


В архиве один как выходит, а второй как должно быть.
Вложения
Тип файла: rar тест.rar (763 байт, 2 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 08.03.2021, 16:21   #30
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,309
По умолчанию

Цитата:
а второй как должно быть.
Код:
if i>0 then 
 s:=... //как и было с запятой
else 
 s:=... //БЕЗ запятой
Цитата:
значит вверху должна быть . Значит надо как то в цикл включать
если текст(шапка) должен быть ОДИН раз то и выводить его надо не в цикле, а ДО.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.03.2021 в 16:27.
evg_m вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "2.txt" первых n строк и вставить их в "1.txt" temphard Помощь студентам 2 03.09.2013 15:03
Удаление первых n-строк из txt-файла Neksion Помощь студентам 2 10.07.2013 17:12
Создать чтение из файла и запись в файл txt на С++ skifre Фриланс 0 01.06.2012 15:16
поиск и выципление строк из txt файла D_e_n_n Помощь студентам 7 04.02.2011 05:39
C# Представление txt файла как массива строк asheb Помощь студентам 7 20.04.2010 11:51