Пример 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.

Консоль перед закрытием программы:

paskal65

Выводы

  • В программах применяются переменные: статические, под которые память выделяется при компоновке программы; динамические, под которые память выделяется в процессе работы.
  • Динамические структуры обеспечивают экономное использование памяти, особенно когда переменных много и они не всегда нужны.
  • Динамические структуры заданного типа (размера) создаются с использованием типизированных указателей p процедурой New(p), а освобождаются процедурой Dispose(p). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется типом данных.
  • Динамические структуры произвольного размера создаются c использованием указателей p процедурой GetMem(p, Size), а освобождаются процедурой FreeMem(p, Size). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется значением Size (фактически это Size*128).
  • После освобождения памяти рекомендуется сделать указатель неопределенным, присвоив ему значение Nil.
TwitterSEO CommunityВаау!News2.ruChippKoricaSMI2Google BookmarksDiggI.uaЗакладки YandexLinkstoreMyscoopCommunizmRu-marksWebmarksRuspaceLinkomaticKli.kzWeb-zakladkaZakladok.netRedditdeliciousMa.gnoliaTechnoratiSlashdotYahoo My WebБобрДобр.ruMemori.rurucity.comМоёМесто.ruMister Wong



Copyright © 2009-2010 Программирование на паскале.