Помощь - Поиск - Пользователи - Календарь
Полная версия: В продолжение прошлой темы о Файлах
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Geroi
Её явно закрыли, а вопросы остались.
Спасибо тем, кто помог. Сейчас буду сидеть разбиратся.
Ну а вот на счёт первой задачи как быть? У меня единственнйы вопрос, как там сделать замену числа? Решать её ненадо !!! Просто подскажите, как заменить в файле чётное число на его произведние, Т.е.
К примеру у нас в файле написано: 2, 13, 45, 56. Нам надо, чтоб там стало 4, 13, 45, 112. Вот как сделать, чтоб чётное число заменялось, без создание нового файла и писалось на том же месте.
СРазу говорю, число максимальное будет 15000. Чтоб не было лишних разговоров. Ну а если Я там был не прав, то извиняюсь. Хотя наврядли !
GLuk
Дык, я ж исходник выложил, может тебя смущает немного асма, но основная идея должна быть понятна. В файле есть так называемый указатель позиции записи/чтения. Который после чтения числа увеличивается на длину прочитанных данных которое, по ходу, нужно изменить я уменьшаю на 2 байта, а после записываю удвоенное/утроенное число, и указатель снова становится на место... 1.gif
___ALex___
всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту
Geroi
такс sad.gif
у к примеру :
Procedure ReadInt;Assembler; 
asm 
   mov ah,3Fh 
   mov bx,Handle 
   mov cx,2 
   lea dx,W 
   int 21h
end

расшифруй пожалуйста "asm, lea"
Alex сделать через "BlockWrite/BlockRead/Seek " это ты имеешь ввиду заменить там существующие функции на эту? Разъясни.
P.S. ну хрен с ним что Я ламер в Паскале.......... пока.... smile.gif Все там были
GLuk
Цитата
всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту


Реализуй пожалуйста, после хоккея  ;)
В плане исходника...

To Geroi: lea dx,W - это значит загрузка относительного смещения переменной W в регистр dx (по англ. load effective address). В данном случае получается, что DS:DX указывает на переменную W, что используется (как эквивалент можно привести тип Pointer) в качестве исходных данных для записи, т.к. пишем тип Integer, то в CX помещаем 2.
Кстати, работает прога то?...
Geroi
нет sad.gif
Она проще должна решатся....... Но всё равно спасибо, может довиду до ума.
___ALex___
щас третий период досмотрю и напишу smile.gif
___ALex___
как и обещал:

program For_Forum;
 uses Crt;
 type
  MyFile = File of Integer;
 var
  F: MyFile;
  i: Integer;

 Begin

  ClrScr;
  WriteLn('Исходное содержание файла:');
  Assign(F, 'C:InFile.dat');
  Rewrite(F);
  for i := 1 to 19 do begin Write(F, i); Write(i:4); end;
  WriteLn;
  WriteLn('Конечное содержание файла:');
  Seek(F, 0);
  while not Eof(F) do begin
   Read(F, i);
   if i mod 2 = 0 then begin
    Seek(F, FilePos(F) - 1);
    i := i * 2; { так пишу потому что компилятор
                      сразу писать Write(F, 2 * i) не даёт и даже
                      приведение не помогает типа Write(F, Integer(2 * i)) ! }
    Write(F, i);
   end;
   Write(i:4);
  end;
  Close(F);
  Erase(F);
  repeat until KeyPressed

 End.


Без BlockRead/... но это без разницы - принцип там тот же - делал как по условию задачи от Нас требовали

to GLuk
У тебя по асме какая книжка?
to Geroi
"Сейчас буду сидеть разбиратся. "
Вот это уважаю!
вот слова написанные одной программистой
"Никакой Интернет со всеми его конференциями, статьями и примерами никогда не заменит программисту собственного опыта. Только то, что добыто (разобрано и понято) своими силами, запоминается надолго и приносит пользу.
Опыта надо набираться обязательно. Читайте help, ищите ответ в исходниках, экспериментируйте с проектом сколько душе угодно, но только обязательно сами... "

в них Истина!
Geroi
Спасибо Alex за задачу.
Если есть мыло или Аська то дай плиз, чтоб форум н забивал если буду вопросы.
GLuk
Ты ж говорил, что все это реализуется через BlockRead/Write. Через типизированный я и сам мог сделать, а если попробовать через эти функции, то ничего не получится (ошибка №6). А все из-за чего, из-за кривого кода работы с FSB в паскале! Поэтому и сделал через дескрипторы. По асме книг нету, только в электр. виде (авторы в явном виде не задаются).

To Geroi: Фишка в том, что переменную W нужно не возводить в квадрат, а умножать на 2. Поэтому происходит такая фигня. Прога хоть файл то создает?
AlaRic
Цитата
Её явно закрыли, а вопросы остались.

Её закрыли из-за хамского поведения участников форума. Будет повторяться - темы будут закрываться!
___ALex___
program For_Forum; 
 uses Crt; 
 var
  F: File;
  i: Byte;
 
 Begin 
 
  ClrScr; 
  WriteLn('Исходное содержание файла:');
  Assign(F, 'C:InFile.dat'); 
  Rewrite(F, 1);
  for i := 1 to 19 do begin BlockWrite(F, i, 1); Write(i:4); end;
  WriteLn; 
  WriteLn('Конечное содержание файла:');
  Seek(F, 0);
  while not Eof(F) do begin 
   BlockRead(F, i, 1);
   if i mod 2 = 0 then begin
    Seek(F, FilePos(F) - 1);
    i := i * 2;
    BlockWrite(F, i, 1);
   end;
   Write(i:4);
  end;
  Close(F);
  Erase(F);
  repeat until KeyPressed 
 
 End.


to GLuk
вот если так хотелось
никакой кривоты я тут не увидел
to Geroi
___ALex___@inbox.ru
GLuk
Не работает нифига, я примерно так сначала и сделал, как и раньше, выдает мне ошибку №6 (это типа несуществующий дескриптор)  ??? :o А с типизированным работает...
___ALex___
to GLuk
в каком месте ошибка происходит?
И что этот номер ошибки значит?
У меня всё работает...
GLuk
Выдает ошибку после третьего обращения к BlockWrite, а ошибка эта значит, что ДОС передан неверный номер дескриптора... эта ошибка в принципе не может возникнуть, если конечно не затереть номер дескриптора в блоке описаловки файла открытого ТП.

И самое обидное:Потестил на другой машине - все идет  :'(

Меня терзают смутные сомнения, может что с машиной не так  :( :o
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.