Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_Delphi_1.doc
Скачиваний:
15
Добавлен:
18.09.2019
Размер:
1.64 Mб
Скачать

Задание 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.

Выводы

  1. В программах применяются переменные:

  • статические, под которые память выделяется при компоновке программы;

  • динамические, под которые память выделяется в процессе работы.

  1. Динамические структуры обеспечивают экономное использование памяти, особенно когда переменных много и они не всегда нужны.

  2. Динамические структуры заданного типа (размера) создаются с использованием типизированных указателей p процедурой New(p), а освобождаются процедурой Dispose(p). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется типом данных.

  3. Динамические структуры произвольного размера создаются c использованием указателей p процедурой GetMem(p, Size), а освобождаются процедурой FreeMem(p, Size). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется значением Size (фактически это Size*128).

  4. После освобождения памяти рекомендуется сделать указатель неопределенным, присвоив ему значение Nil.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]