Современные операционные системы
не позволяют обращаться к любому участку оперативной памяти. Это в
частности вызвано многозадачностью системы, т. е. чтобы одна
программа, умышленно или по ошибке не могла исказить данные другой
программы. Для доступа к памяти, сначала нужно запросить у операционной
системы память, требуемого размера. Для работы с памятью в
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. В итоге мы видим текст из
выбранного файла.