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

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

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

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Обмен информацией в файлах.
IUnknown
сообщение 26.05.2011 18:01
Сообщение #21


a.k.a. volvo877
*****

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

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


Цитата
Что я делаю не так.
Хм... Как бы, не надо читать данные туда, где находится сам указатель. Надо читать туда, куда он указывает:

BlockRead(f,b^,ser);
Ты же читал прямо в указатель (и в смежные с ним переменные), разумеется все портил к чертям собачьим, а потом еще и вызывал FreeMem неизвестно какой области (кто знает, что там было в файле, и куда теперь указывают b и p). Еще скажи спасибо, что получаешь "Invalid pointer operation", могло бы по-тихому что-то там освободить, и ты б не узнал, что делаешь что-то не так...

P.S. С записью через BlockWrite - та же петрушка: передавай ей сам буфер, т.е., разыменованный указатель. Да, а кто будет освобождать память после окончательного завершения копирования?

Сообщение отредактировано: IUnknown - 26.05.2011 18:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 26.05.2011 19:15
Сообщение #22


Профи
****

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

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


Я пробовал мнооого вариантов в одном из них мой файлик освободился так,что туда 930 мегабайт записалось)))Лан щас дорвусь до компа попробую.

BlockRead(f,b^,ser);


Нечто подолное я видел,но там была связка вида

var
b : ^byte;\\Ну или ^integer, ^real и тд
...........
BlockRead(f,b^,ser);

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 26.05.2011 19:45
Сообщение #23


Профи
****

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

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


Так,я совсем запутался.У меня есть b и p ,указатели на массивы байтов,выделить мне память надо для самих массивов так?Если да,то проведя анолонию с предыдущими комметариями я должен вызвать GetMem от разименованного указателя GetMem(b^,ser);
Но сделав это я при компиляции получаю .Poiter variable expected.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 26.05.2011 20:05
Сообщение #24


a.k.a. volvo877
*****

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

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


Цитата
Если да,то проведя анолонию с предыдущими комметариями я должен вызвать GetMem от разименованного указателя GetMem(b^,ser);
Нет... Погоди, ты меня тоже запутал...

Значит, так: выделяешь память, адрес выделенного блока заносишь в указатель (а не туда, куда он указывает. Он у тебя еще не указывает никуда):
GetMem(b, ser); // Без разыменования

// работаешь - БУФЕРОМ, на который УКАЗЫВАЕТ b:
BlockRead(f, b^, ser); // С разыменованием
BlockWrite(f, b^, ser); // аналогично...

// освобождаешь - память, адрес которой хранится в УКАЗАТЕЛЕ:
FreeMem(b^, ser);
Откуда ты взял, что надо в GetMem/FreeMem разыменовывать указатель? Эти процедуры выделяют память, а не работают с ней, поэтому имеют дело только с самим указателем. Куда он указывает - их мало интересует (если вообще интересует).

У тебя F1 заело? Посмотри, что пишет контекстная помощь о GetMem/FreeMem и что - о BlockRead/BlockWrite:

Цитата
procedure GetMem(var P: Pointer; Size: Word);
procedure FreeMem(var P: Pointer; Size: Word);

procedure BlockRead(var F: File; var Buf; Count: Word [; var Result: Word]);
procedure BlockWrite(var f: File; var Buf; Count: Word [; var Result: Word]);
Чувствуешь разницу? Гте-то нужен указатель, а где-то - бестиповый кусок памяти. Это - как раз то, на что указатель показывает...

Сообщение отредактировано: IUnknown - 26.05.2011 20:12
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 26.05.2011 20:50
Сообщение #25


Профи
****

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

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


У меня "семерка" 64 разрядная,так что запускаю я через Dos box, навыков работы с ним у меня мало(практически нет) все что могу это запустить ту программу,что мне нужна.В общем вместо хелпа он мне выдает кучу всяких иероглифоф в которых разобратсья невозможно,понятно,что надо менять кодировку,но где и как, я не знаю.Когда я пытался запускать ЛИСП он вообще отказывался подключать хелп и говорил,что его нету.

В общем исправил,нормально отработало с файлами на 1 КБ и 84 КБ.Но что то мне кажется,что если оба файла будут больше и их кратность будет больше чем 64кб,то тут возникнут проблемы.
Кстати время выполнения уже становится физически ощутимым.(возможно из-за эмулятора).

type
TArr= array [0..65528] of byte;
PArr = ^TArr;

function nod(x,y : longint):longint;
begin
if x<>0 then nod:=nod( y mod x, x) else nod:=y;
end;

var
f, g :file;
b,p : PArr;
posf, posg :longint;
ser: longint;

begin
assign(f, '01.txt'); reset(f,Sizeof(byte));
posf :=filesize(f);
assign(g, '02.txt'); reset(g,Sizeof(byte));
posg :=filesize(g);
ser:=nod(posf,posg);
GetMem(b,ser );
GetMem(p,ser);

while not eof(f) and not eof(g) do
begin
BlockRead(f,b^,ser);
seek(f,filepos(f)-Sizeof(byte)*ser);
BlockRead(g,p^,ser);
seek(g,filepos(g)-Sizeof(byte)*ser);
BlockWrite(f,p^,ser);
BlockWrite(g,b^,ser);
end;

if eof(f) then
while not eof(g) do
begin
BlockRead(g,b^,ser);
Blockwrite(f, b^,ser);
end;
if eof(g) then
while not eof(f) do
begin
BlockRead(f, b^,ser);
BlockWrite(g, b^,ser);
end;
seek(f,posg); truncate(f);
seek(g,posf); truncate(g);

FreeMem(b,ser);
FreeMem(p,ser);

close(f); close(g);
end.



Сообщение отредактировано: Krjuger - 26.05.2011 21:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 24.06.2025 13:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"