Описание функции


GetMemory

Возвращает указатель буфера памяти переменной

GetMemory(SymbolName.s, [*AllocatedMemory=#Null, AllocatedSize.i=#PB_Ignore])

Параметры

SymbolName.s Имя переменной в виде строки из символов
*AllocatedMemory Указатель на участок памяти, в который будут записаны данные переменой SymbolName.s
Если не указано, то автоматически выделяется нужный размер (с помощью AllocateMemory()) и возвращается указатель на данные, а AllocatedSize.i игнорируется.
Если указана память, то обязательно должен указан её размер, при этом если он меньше необходимого, то копируется только то что поместится.
AllocatedSize.i Размер участка памяти *AllocatedMemory, чтобы предотвратить переполнение. По умолчанию #PB_Ignore - длина не определена, используется с *AllocatedMemory=#Null.

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

Возвращает указатель на буфер памяти, выделенного PureBasic`ом, в котором будут находится данные.
Возвращает #Null, если переменная не существует или не является строковым объектом или длина переменной SymbolName.s равна 0

Примечания

Требуется использовать FreeMemory(), чтобы освободить память, если она выделена автоматически.
Если задан указатель *AllocatedMemory, но не указан размер памяти AllocatedSize.i, то может произойти переполнение.

Пример

; STARGATE
; https://www.purebasic.fr/english/viewtopic.php?t=76279
XIncludeFile "../Library/Lizard.pbi"

; Lizard всегда должен быть инициализирован до выполнения каких либо операций с ним.
If Lizard::Initialize("../Library") ; Укаэите путь к папке с Lizard.dll.
    Debug "Lizard был инициализирован. Версия " + Lizard::Version()
Else
    Debug "Не удалось выполнить инициализацию Lizard"
    End
EndIf

; Перенос списка Lizard в массив Pure Basic

Lizard::Evaluate("list = {1.2, 3.45, 6.789, 0.1234, 5.67890}") ; Присваивает переменной списка "list" некоторые значения.
Debug "Список Lizard: " + Lizard::Evaluate("list") ; Теперь переменная "list" содержит реальные значения.
Lizard::Evaluate(~"buffer = Apply(Join, ToString(#, BinaryFormat->\"float64\") &/@ list )") ; Преобразует значения в бинарные строки и соединяет их вместе. Обратите внимание, что здесь используется формат float64 (double).
Debug "Участок памяти: " + Lizard::Evaluate("buffer") ; Теперь "buffer" содержит бинарную строку всех значений в формате double.

Define Dim Doubles.d(4) ; Создание некоего массива. Обратите внимание, что используется тип double (64 бита, 8 байт)!
Lizard::GetMemory("buffer", @Doubles()) ; Заполняет буфер памяти массива содержимым переменной "buffer"
Debug "Doubles(0) = " + Doubles(0)
Debug "Doubles(1) = " + Doubles(1)
Debug "Doubles(2) = " + Doubles(2)
Debug "Doubles(3) = " + Doubles(3)
Debug "Doubles(4) = " + Doubles(4)

; Завершение Lizard.
Lizard::Terminate()