Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ В продолжение прошлой темы о Файлах

Автор: Geroi 2.05.2003 20:17

Её явно закрыли, а вопросы остались.
Спасибо тем, кто помог. Сейчас буду сидеть разбиратся.
Ну а вот на счёт первой задачи как быть? У меня единственнйы вопрос, как там сделать замену числа? Решать её ненадо !!! Просто подскажите, как заменить в файле чётное число на его произведние, Т.е.
К примеру у нас в файле написано: 2, 13, 45, 56. Нам надо, чтоб там стало 4, 13, 45, 112. Вот как сделать, чтоб чётное число заменялось, без создание нового файла и писалось на том же месте.
СРазу говорю, число максимальное будет 15000. Чтоб не было лишних разговоров. Ну а если Я там был не прав, то извиняюсь. Хотя наврядли !

Автор: GLuk 2.05.2003 21:26

Дык, я ж исходник выложил, может тебя смущает немного асма, но основная идея должна быть понятна. В файле есть так называемый указатель позиции записи/чтения. Который после чтения числа увеличивается на длину прочитанных данных которое, по ходу, нужно изменить я уменьшаю на 2 байта, а после записываю удвоенное/утроенное число, и указатель снова становится на место... 1.gif

Автор: ___ALex___ 2.05.2003 21:37

всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту

Автор: Geroi 2.05.2003 22:28

такс 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 2.05.2003 22:59

Цитата
всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту


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

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

Автор: Geroi 2.05.2003 23:22

нет sad.gif
Она проще должна решатся....... Но всё равно спасибо, может довиду до ума.

Автор: ___ALex___ 2.05.2003 23:35

щас третий период досмотрю и напишу smile.gif

Автор: ___ALex___ 3.05.2003 0:49

как и обещал:

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 3.05.2003 10:17

Спасибо Alex за задачу.
Если есть мыло или Аська то дай плиз, чтоб форум н забивал если буду вопросы.

Автор: GLuk 3.05.2003 10:27

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

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

Автор: AlaRic 3.05.2003 10:58

Цитата
Её явно закрыли, а вопросы остались.

Её закрыли из-за хамского поведения участников форума. Будет повторяться - темы будут закрываться!

Автор: ___ALex___ 3.05.2003 14:24

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 3.05.2003 15:03

Не работает нифига, я примерно так сначала и сделал, как и раньше, выдает мне ошибку №6 (это типа несуществующий дескриптор)  ??? :o А с типизированным работает...

Автор: ___ALex___ 3.05.2003 15:10

to GLuk
в каком месте ошибка происходит?
И что этот номер ошибки значит?
У меня всё работает...

Автор: GLuk 3.05.2003 16:19

Выдает ошибку после третьего обращения к BlockWrite, а ошибка эта значит, что ДОС передан неверный номер дескриптора... эта ошибка в принципе не может возникнуть, если конечно не затереть номер дескриптора в блоке описаловки файла открытого ТП.

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

Меня терзают смутные сомнения, может что с машиной не так  :( :o