IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> В продолжение прошлой темы о Файлах
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


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


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


всё можно сделать легко через BlockWrite/BlockRead/Seek
асм вообще не к месту
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


такс 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 Все там были
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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


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

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


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


нет sad.gif
Она проще должна решатся....... Но всё равно спасибо, может довиду до ума.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


щас третий период досмотрю и напишу smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


как и обещал:

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, ищите ответ в исходниках, экспериментируйте с проектом сколько душе угодно, но только обязательно сами... "

в них Истина!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 29

Репутация: -  0  +


Спасибо Alex за задачу.
Если есть мыло или Аська то дай плиз, чтоб форум н забивал если буду вопросы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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

To Geroi: Фишка в том, что переменную W нужно не возводить в квадрат, а умножать на 2. Поэтому происходит такая фигня. Прога хоть файл то создает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


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

Её закрыли из-за хамского поведения участников форума. Будет повторяться - темы будут закрываться!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


to GLuk
в каком месте ошибка происходит?
И что этот номер ошибки значит?
У меня всё работает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


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

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

Меня терзают смутные сомнения, может что с машиной не так  :( :o
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.10.2020 21:17
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name