- •1.Интегрированная среда разработки Delphi
- •2.Структура программы и типы в языке Delphi
- •3.Линейные структуры
- •4.Структуры с ветвлениями
- •5.Циклы с неизвестным числом повторений
- •6.Циклы с заданным числом повторений
- •Задание к работе
- •7.Массивы
- •8.Файлы
- •9.Подпрограммы
- •10.Динамическая память Подготовка к работе
- •Контрольные вопросы
- •Задание к работе
- •Задание 1
- •Задание 2
- •11.Исключения
Задание 2
Программа скоростного копирования файла произвольного размера (файл prg_8_1.exe) из папки 08_01 в папку 10_02 с использованием ДП и процедур GetMem и FreeMem. Окно работающего приложения задания 2 показано на рис. 10 .24.
рис. 10.24. Окно работающего приложения задания 2
Листинг программы:
program Prg_10_2;
{$APPTYPE CONSOLE}
uses
SysUtils,RusTrans;
const
FileDir1='c:\users\PO_11\Ivanov\08_1\';
FileDir2='c:\users\PO_11\Ivanov\10_2\';
var
InFile,OutFile:file; // Файловые переменные
FilePath1,FilePath2:string; // Пути к файлам
Size:Integer; // Число записей
Buffer:PChar; // Буфер в ДП
begin
FilePath1:=FileDir1+'prg_8_1.exe'; // Путь к файлу источнику
AssignFile(InFile,FilePath1); // Связь с файлом источником
FilePath2:=FileDir2+'prg_8_1a.exe'; // Путь к файлу приемнику
AssignFile(OutFile,FilePath2); // Связь с файлом приемником
Reset(InFile); // Открыть InFile
Rewrite(OutFile); // Создать OutFile
Size:=FileSize(InFile); // Число записей(по 128 байт) в InFile
writeln(Rus('Размер входного файла = '),Size);
GetMem(Buffer,Siz // Выделить в ДП Buffer (в байтах)
writeln(Rus('Размер буфера = '),SizeOf(Buffer),
Rus(' блока по 128 байт'));
readln;
BlockRead(InFile,Buffer^,Size); // Копирование в Buffer
BlockWrite(OutFile,Buffer^,Size); // Копирование в 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.