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


        Современные операционные системы не позволяют обращаться к любому участку оперативной памяти. Это в частности вызвано многозадачностью системы, т. е.  чтобы одна программа, умышленно или по ошибке не могла исказить данные другой программы. Для доступа к памяти, сначала нужно запросить у операционной системы память,  требуемого размера. Для работы с памятью в 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
; Открываем окно
OpenWindow(1,0,0,400,400,"Работа с памятью", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
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. В итоге мы видим текст из выбранного файла.


Учебник                Главная
Сайт создан в системе uCoz