Работа с памятью

Автор : Петр Высочанский

# Вернуться на главную

 
    Современные операционные системы не позволяют обращаться к любому участку оперативной памяти. Это в частности вызвано многозадачностью системы, т. е.  чтобы одна программа, умышленно или по ошибке не могла исказить данные другой программы. Для доступа к памяти, сначала нужно запросить у операционной системы память,  требуемого размера.
Для работы с памятью в PureBasic есть ряд функций, описание которых можно найти в разделе Memory справки.

Итак, для того, чтобы получить доступ к памяти, её сначала нужно "заказать" у операционной системы, затем выполнить требуемые действия, после чего нужно обязательно освободить память, что-бы избежать её "утечек". Под словом "утечка" имеется в виду использование памяти программой, после того, как она становится не нужной для дальнейших операций. Этого следует всячески избегать.

Вот пример работы с памятью.

*MemoryID = AllocateMemory(50) ;Запрашиваем у ОС 50 байт памяти
 If *MemoryID
    ;В цикле производится запись в память
    For i=0 To 9
      PokeC(*MemoryID+i, i)
    Next i
   
    ;В цикле производится чтение из памяти
    For i=0 To 9
     Debug PeekC(*MemoryID+i)
    Next i
    ;Запись строки в память
    PokeS(*MemoryID, "Работа с памятью")
   
    ;Чтение строки из памяти
    Debug PeekS(*MemoryID)
   
    FreeMemory(*MemoryID)  ;Освобождаем память, т. к. она больше не нужна
 Else
    MessageRequester("", "Не удалось выделить память!")
 EndIf

С помощью функции AllocateMemory у операционной системы запрашивается требуемое число байт, в данном случае 50. В случае успеха, функция возвращает указатель на первую ячейку памяти. Если по той или иной причине, не удалось выделить память, то функция вернет число 0. Оператор If проверяет чтобы в переменной-указателе было число не равное нулю. В цикле For - Next происходит запись 10 байт в первые 10 ячеек выделенной памяти, а затем, в следующем цикле, данные из памяти считываются и отображаются в отладочном окне. Потом в память записывается строка текста, после чего считывается от-туда.
Функция FreeMemory освобождает память, т. к. для работы программы она больше не нужна.

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

File.s=OpenFileRequester("","","Текстовые файлы (txt)|*.txt",0)
If File<>""
  If ReadFile(0, File) ;Открытие файла
    Size=Lof(0) ;Определение размера файла в байтах
   
*mem=AllocateMemory(Size) ; Запрашиваем у ОС число байт, равное размеру файла
   
If *mem
      ReadData(0, *mem, Size)
;Копирование данных из файла в память
      CloseFile(0) ;Закрытие файла
      Text.s=PeekS(*mem) ;Копируем данные из памяти в строковую переменную
      FreeMemory(*mem) ;Освобождаем память
    Else
      MessageRequester("", "Не удалось получить запрашиваемую память")
      End ;Завершение работы программы
    EndIf
  Else
    MessageRequester("", "Не удалось открыть файл")
    End ;Завершение работы программы
  EndIf
EndIf
;Открываем окно
#flag = #PB_Window_MinimizeGadget| #PB_Window_ScreenCentered
OpenWindow(1,0,0,400,400,"Работа с памятью", #flag)
CreateGadgetList(WindowID(1))
EditorGadget(1,2,2,396,396) ;Создаём текстовый редактор
SetGadgetText(1,Text) ;Помещаем текст из строковой переменной в редактор

Repeat ;Главный цикл программы
 Event=WaitWindowEvent()
;Получаем идентификатор события в программе
Until Event=#PB_Event_CloseWindow  ;Прерываем цикл если нужно закрыть окно


Оранжевым цветом
выделены строки, в которых происходит работа с памятью.
В начале программы с помощью функции OpenFileRequester создаётся стандартное окно выбора открываемого файла, в котором нужно указать путь с текстовому файлу, имеющему расширение TXT. Функция возвращает полный путь к выбранному файлу, который будет записан в строковую переименую File. Далее открывается выбранный файл и определяется его размер - количество байт в файле. Затем с помощью функции AllocateMemory выделяется размер памяти, равный размеру файла и с помощью функции ReadData данные из файла копируются в память. Так как файл нам больше не нужен (его копия хранится в памяти), то его закрываем с помощью функции CloseFile. Далее с помощью функции PeekS считываются данные из памяти и помещаются в строковую переменную с именем Text. Так как данные были скопированы в переменную и память нам больше не нужна, то её освобождаем при помощи функции FreeMemory.

Далее открывается окно и создаётся текстовый редактор, в который помещается текст из переменной
Text. В итоге мы видим текст из выбранного файла.

# 

Материал взят с сайта  http://pure-basic.narod.ru/docs/memory.html 

Вернуться на главную

#

 










Используются технологии uCoz