Изучение функций работы с памятью. Написание программы, интерпретирующей одни и те же данные различными способами

Страницы работы

Фрагмент текста работы

Задание: Захватить один кусок памяти размером N Кбайт. Заполнить его нулями. Захватить другой кусок памяти размером M Кбайт памяти и записать туда строку S. Оставшиеся байты должны быть случайными (равномерно распределенными). Затем требуется заполнить первый кусок памяти с выравниванием на N/M байт. Вывести в консольном режиме:

а) Байтовую картину памяти первого куска (в десятичном и шестнадцатеричном виде - опционально);

б) Четырехбайтную (беззнаковую) картину памяти первого куска;

с) Четырехбайтную (знаковую) картину памяти первого куска;

д) Символьную картину памяти.

Переписать содержимое памяти в обратном порядке. Принять минимальный размер переписываемого блока:

a) один байт

b) два байта

c) четыре байта

d) восемь байт

Исходные данные:

N= 2  Кбайт

M=1.125 Кбайт

S=’}{][/\\/ndbcbf sdfsuihur nnn kshjsh windows.pas’

Функции и процедуры для работы с памятью, используемые в программе:

GlobalAlloc

Функция GlobalAlloc выделяет из кучи указанное число байт.

function GlobalAlloc(

uFlags: UINT;    // атрибутывыделения

dwBytes: DWORD   // количествовыделяемыхбайт

): HGLOBAL; stdcall;

Параметры:

uFlags : указывает каким образом производить выделение памяти. Если в качестве параметра указан нуль, то по умолчанию используется значение GMEM_FIXED. Указанный параметр может быть комбинацией указанных ниже значений, недопустимые комбинации специально оговорены:

Флаг

Назначение

GHND

Комбинация флагов GMEM_MOVEABLE и GMEM_ZEROINIT.

GMEM_FIXED

Выделяет фиксированную память. Возвращаемое значение указатель.

GMEM_MOVEABLE

Выделяет перемещаемую память. В Win32 блоки памяти никогда не могут перемещаться в физической памяти, но они могут быть перемещены внутри владеющими ними кучи. Указанное значение нельзя комбинировать с флагом GMEM_FIXED.

GMEM_ZEROINIT

Инициализирует память нулями.

GPTR

Комбинация флагов GMEM_FIXED и GMEM_ZEROINIT.

dwByte : указывает количество байт, которые будут выделены.

Описание:

При удачном завершении функции выделенный размер памяти как минимум не меньше запрашиваемого. Но если выделенный размер памяти больше запрашиваемого, то процесс может использовать остаток.

Возвращаемое значение:

В случае успешного завершения возвращаемым значением функции является дескриптор нового объекта в памяти. В случае ошибки - значение 0.

GlobalFree

Функция GlobalFree позволяет освободить объект глобальной памяти и уничтожить его дескриптор.

function GlobalFree(

hMem: HGLOBAL              // дескриптор объекта глобальной памяти

): HGLOBAL; stdcall;

Параметры:

hMem: дескриптор объекта глобальной памяти.

Возвращаемое значение:

В случае удачного завершения функция возвращает 0. В случае ошибки, возвращаемое значение функции равно переданному дескриптору объекта глобальной памяти.

Описание:

Если процесс модифицирует память после того, как она была освобождена, может случиться повреждение кучи или возникнуть исключение EAccessViolation (нарушение доступа). Если параметр hMem равер нулю, то выполнение GlobalFree приводит к возникновению исключительной ситуации EAccessViolation. Функция GlobalFree может освободить также и объект, заблокированный в памяти. Заблокированным считается такой объект, счетчик блокировок которого больше нуля.

GlobalLock

Функция GlobalLock позволяет зафиксировать объект глобальной памяти и возвращает указатель на начальный байт блока памяти объекта.

function GlobalLock(

hMem: HGLOBAL    // дескриптор объекта глобальной памяти

): Pointer; stdcall;

 Параметры:

hMem : дескриптор объекта глобальной памяти.

Возвращаемое значение:

При удачном завершении функция возвращает указатель на начальный байт блока памяти. В случае ошибки возвращаемым значением является nil.

Описание:

Внутренняя структура данных каждого объекта в памяти содержит счетчик блокировок, который первоначально равен нулю. Функция GlobalLock увеличивает счетчик блокировок на единицу.

GlobalUnlock

Функция GlobalUnlock уменьшает счетчик блокировок указанного объекта глобальной памяти на единицу. Указанный объект должен быть выделен с указанием флага GMEM_MOVEABLE. Если указанный объект был выделен с указанным флагом GMEM_FIXED, то функция ничего не выполняет.

function GlobalUnlock(hMem: HGLOBAL): BOOL; stdcall;

Параметры:

hMem [in]: Дескриптор объекта глобальной памяти, для которого будет произведено уменьшение количества блокировок. Должен быть получен путем вызова функций GlobalAlloc или GlobalReAlloc.

Возвращаемое значение:

Если после выполнения уменьшения счетчика блокировок указанный объект все еще остается блокированным, то возвращаемым значением функции является True. В случае ошибки функция возвращает False. Для получения расширенной информации об ошибке следует сделать вызов GetLastError. Если вызов GetLastError возвратил значение NO_ERROR, то объект глобальной памяти был успешно разблокирован.

Описание:

Внутренняя структура данных каждого объекта в памяти содержит счетчик блокировок, который первоначально равен нулю. Функция GlobalLock увеличивает счетчик блокировок на единицу, а функция GlobalUnlock уменьшает

Похожие материалы

Информация о работе