Пример 10.2.
Программа скоростного копирования файла произвольного размера (файл prg_8_1.exe) из папки 08_01 в папку 10_02 с использованием ДП и процедур GetMem и FreeMem.
Листинг программы
program prg_10_2;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, RusTrans;
const
FileDir1=’m:\Lazarus_Examples\08_1\’;
FileDir2=’m:\Lazarus_Examples\10_2\’;
var
InFile,OutFile:file; // Файловые переменные
FilePath1,FilePath2:string; // Пути к файлам
Size:Integer; // Число записей
Buffer:PChar; // Буфер в ДП
begin
FilePath1:=FileDir1+’prg8_1.exe’; // Путь к файлу источнику
AssignFile(InFile,FilePath1); // Связь с файлом источником InFile
FilePath2:=FileDir2+’prg8_1a.exe’; // Путь к файлу приемнику
AssignFile(OutFile,FilePath2); // Связь с файлом приемником OutFile
Reset(InFile); // Открыть InFile
Rewrite(OutFile); // Создать OutFile
Size:=FileSize(InFile); // Число записей (по 128 байт) в InFile
writeln(Rus(‘Размер входного файла = ‘),Size);
GetMem(Buffer,Size*128); // Выделить в ДП Buffer (в байтах)
writeln(Rus(‘Размер буфера = ‘),
SizeOf(Buffer),Rus(‘ блока по 128 байт’));
readln;
BlockRead(InFile,Buffer^,Size); // Копирование из Infile в Buffer
Blockwrite(OutFile,Buffer^,Size); // Копирование из Buffer в OutFile
writeln(Rus(‘Копирование завершено’));
writeln(Rus(‘Размер выходного файла = ‘),FileSize(OutFile));
readln;
FreeMem(Buffer); // Освободить Buffer
Buffer:=Nil; // Сделать Buffer пустым
write(Rus(‘Буфер=’));
if Buffer=Nil then writeln(‘Nil’)
else writeln(Rus(‘Ошибка’));
CloseFile(InFile); // Закрыть файлы
CloseFile(OutFile);
readln // Пауза
end.
Внимание. Size – размер выделяемой памяти в записях (по умолчанию это 128 байт). Для пары процедур GetMem, FreeMem имя указателя и размер памяти должны быть одинаковы. Удалять нужно точно те байты, которые выделялись. В процедуре FreeMem размер можно пропустить, по умолчанию он будет таким же, как в процедуре GetMem.
Консоль перед закрытием программы:
Выводы
- В программах применяются переменные: статические, под которые память выделяется при компоновке программы; динамические, под которые память выделяется в процессе работы.
- Динамические структуры обеспечивают экономное использование памяти, особенно когда переменных много и они не всегда нужны.
- Динамические структуры заданного типа (размера) создаются с использованием типизированных указателей p процедурой New(p), а освобождаются процедурой Dispose(p). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется типом данных.
- Динамические структуры произвольного размера создаются c использованием указателей p процедурой GetMem(p, Size), а освобождаются процедурой FreeMem(p, Size). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется значением Size (фактически это Size*128).
- После освобождения памяти рекомендуется сделать указатель неопределенным, присвоив ему значение Nil.