1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Хм... Как бы, не надо читать данные туда, где находится сам указатель. Надо читать туда, куда он указывает:
BlockRead(f,b^,ser);
Ты же читал прямо в указатель (и в смежные с ним переменные), разумеется все портил к чертям собачьим, а потом еще и вызывал FreeMem неизвестно какой области (кто знает, что там было в файле, и куда теперь указывают b и p). Еще скажи спасибо, что получаешь "Invalid pointer operation", могло бы по-тихому что-то там освободить, и ты б не узнал, что делаешь что-то не так...
P.S. С записью через BlockWrite - та же петрушка: передавай ей сам буфер, т.е., разыменованный указатель. Да, а кто будет освобождать память после окончательного завершения копирования?
Так,я совсем запутался.У меня есть b и p ,указатели на массивы байтов,выделить мне память надо для самих массивов так?Если да,то проведя анолонию с предыдущими комметариями я должен вызвать GetMem от разименованного указателя GetMem(b^,ser); Но сделав это я при компиляции получаю .Poiter variable expected.
Если да,то проведя анолонию с предыдущими комметариями я должен вызвать 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 BlockRead(var F: File; var Buf; Count: Word [; var Result: Word]); procedure BlockWrite(var f: File; var Buf; Count: Word [; var Result: Word]);
Чувствуешь разницу? Гте-то нужен указатель, а где-то - бестиповый кусок памяти. Это - как раз то, на что указатель показывает...
У меня "семерка" 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;
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);