Метод БИБЛИОТЕКА_ПОСРЕДНИК. ЗАПИСАТЬ
Метод ЗАПИСАТЬ позволяет установить значения входных параметров в буфере промежуточной DLL. За один вызов метода ЗАПИСАТЬ можно установить только одно значение простого типа, например, поля структуры.
Метод ЗАПИСАТЬ можно использовать после вызова ПОДГОТОВИТЬ и до вызова метода ВЫЗВАТЬ.
ФУНКЦИЯ ЛОГИКА: ЗАПИСАТЬ(*: значение; ЦЕЛОЕ: тип_данных; ЦЕЛОЕ: вид_знач; ЦЕЛОЕ: поз = 0; СТРОКА: путь = ""; БП_ИНДЕКСЫ: индексы = ())
Параметры
- значение
- Устанавливаемое значение одного из следующих типов:
- тип_данных
- Тип данных на стороне промежуточной DLL. Задается одной из констант БП_ТИП_.... Тип параметра значение должен соответствовать заданной константе БП_ТИП_....
- вид_знач
- Определяет вид устанавливаемого значения. Влияет на интерпретацию параметров поз и путь.
Задается константами БП_ЗНАЧ_....
Допускается использование следующих констант:
- БП_ЗНАЧ_ПАРАМ - значение параметра функции;
- БП_ЗНАЧ_САМ - значение указателя на интерфейс при вызове метода;
- БП_ЗНАЧ_ВРЕМ - временное значение.
- поз
-
Смысл параметра зависит от вид_знач:
- БП_ЗНАЧ_ПАРАМ - номер параметра (нумерация от 1) или 0, если имя параметра включено в путь;
- БП_ЗНАЧ_САМ - должен указываться 0;
- БП_ЗНАЧ_ВРЕМ - номер временного значения, ранее переданный в метод ВЫДЕЛИТЬ.
- путь
- Определяет список имен полей вложенных структур, разделенных точкой. Если вид_знач задан как БП_ЗНАЧ_ПАРАМ, а поз равен 0, то первым элементом указывается имя параметра функции. Это позволяет обращаться к параметрам функции не по порядковому номеру, а по имени.
- индексы
- Определяет список индексов массивов, включая вложенность. Например, есть массив структур, где в каждой структуре есть массив чисел. Первый индекс задает позицию в массиве структур, второй - в массиве чисел этой структуры. Нумерация элементов массивов производится от нуля.
Возвращаемое значение
ДА – при успешном вызове, НЕТ – в противном случае. В случае ошибки дополнительную информацию можно получить вызовом метода ПОСЛ_ОШИБКА.
Пример
Пусть сторонний компонент предоставляет структуры точки и треугольника на плоскости, а также функцию вычисления площади треугольника на языке C:
struct Point { double x; double y; }; struct Triangle { Point point[3]; }; double CalcSquare(Triangle* tr);
Представим реализацию промежуточной DLL так, что параметр функции CalcSquare рассматривается как входной, а передача указателя - лишь несущественная деталь. Для заполнения входного параметра tr воспользуемся методом ЗАПИСАТЬ:
ПЕРЕМ БИБЛИОТЕКА_ПОСРЕДНИК: библ //... библ.ПОДГОТОВИТЬ("CalcSquare") // здесь в буфере параметров уже создана структура Triangle - заполним ее // запись данных с использованием номера параметра (1) библ.ЗАПИСАТЬ(5.67, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.x", (0)) // tr.point[0].x библ.ЗАПИСАТЬ(3.13, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.y", (0)) // tr.point[0].y библ.ЗАПИСАТЬ(7.22, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.x", (1)) // tr.point[1].x библ.ЗАПИСАТЬ(2.03, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.y", (1)) // tr.point[1].y // запись данных с использованием имени параметра (tr) библ.ЗАПИСАТЬ(0.32, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 0, "tr.point.x", (2)) // tr.point[2].x библ.ЗАПИСАТЬ(1.43, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 0, "tr.point.y", (2)) // tr.point[2].y // вызываем функцию CalcSquare библ.ВЫЗВАТЬ // получаем площадь ПЕРЕМ ЧИСЛО: площадь библ.СЧИТАТЬ(площадь, БП_ТИП_FLOAT64, БП_ЗНАЧ_РЕЗУЛЬТАТ) библ.ОЧИСТИТЬ
Для иллюстрации работы со временными значениями и указателями представим реализацию промежуточной DLL "в лоб". При реализации "в лоб" функция CalcSquare принимает входной параметр типа указатель на треугольник. Создадим временное значение типа Triangle, заполним его и передадим указатель функции CalcSquare:
ПЕРЕМ БИБЛИОТЕКА_ПОСРЕДНИК: библ //... библ.ПОДГОТОВИТЬ("CalcSquare") // здесь в буфере параметров нулевой указатель на Triangle КОНСТ врем_треуг = 42 // произвольное число, идентификатор временного значения // получаем указатель на треугольник в строковом виде (например, "0x1B32FA35") ПЕРЕМ СТРОКА: указатель_на_треуг = библ.ВЫДЕЛИТЬ(врем_треуг, БП_ТИП_СТРУКТУРА, "Triangle") // запись данных во временное значение библ.ЗАПИСАТЬ(5.67, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.x", (0)) // point[0].x библ.ЗАПИСАТЬ(3.13, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.y", (0)) // point[0].y библ.ЗАПИСАТЬ(7.22, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.x", (1)) // point[1].x библ.ЗАПИСАТЬ(2.03, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.y", (1)) // point[1].y библ.ЗАПИСАТЬ(0.32, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.x", (2)) // point[2].x библ.ЗАПИСАТЬ(1.43, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.y", (2)) // point[2].y // заносим значение указателя в параметр функции библ.ЗАПИСАТЬ(указатель_на_треуг, БП_ТИП_УКАЗАТЕЛЬ, БП_ЗНАЧ_ПАРАМ, 1) // вызываем функцию CalcSquare библ.ВЫЗВАТЬ // получаем площадь ПЕРЕМ ЧИСЛО: площадь библ.СЧИТАТЬ(площадь, БП_ТИП_FLOAT64, БП_ЗНАЧ_РЕЗУЛЬТАТ) библ.ОЧИСТИТЬ