Добрый день!
Задача. Есть набор статических данных(меток). Фиксированное положение и не меняется. Объект выдает свое положение. Если находиться рядом с одной из меток зафиксировать сей факт(например увеличить значение переменной на 1).
Идея. Привязать координаты примитива (квадрат) на мнемосхеме к положению объекта (в масштабе) и возле каждой метки отображать сколько раз объект проехал через нее.
Теперь решение. Согласно этой теме https://simple-scada.com/forum/index.php?topic=818.0 можно сделать массив с положением меток.
Так же есть глобальный модуль и в принципе объектов не много, метки одни и те же и можно написать одну глобальную процедуру и использовать ее для всех объектов и будущих.
Проблемы. Создаем массив в глобальном модуле:
interface
var
array_test: Array[1..3] of Single = (0, 6.8, 10.3)
Пишем процедуру в implementation. Добавляем ее в interface.
Тут вопрос. В interface блок var как то надо заканчивать? Или после переменных можно сразу добавлять определения процедур и функций?
Итак:
procedure proverka(f_array:Array of Single; f_positionTC:TM_Variable; f_dlina_XXX:Single; f_speedTCms:TM_Variable);
Отличие: определяем массив как Array[1..3] of Single, а в процедуре Array of Single. Компиляция проходит.
Вызываем скрипт и ... получаем ошибку о не совпадении типов
'Incompatible types DYNARRAY_Single and ArrayType_1000179'. Понимаю что есть динамический в процедуре и статический в определении массива.
Эксперименты описывать не буду. В глобальном модуле не получилось.
Второй вариант определить локально в скрипте массив.
Определяем массив:
var
array_test_v1: Array of Single;
Инициализируем:
array_test_v1[1] := 0.0;
array_test_v1[2] := 6.8;
array_test_v1[3] := 10.3;
Вызываем глобальную процедуру:
proverka(array_test_v1,
positionTC,
dlina_430,
speedTCms);
Компиляция проходит. Но в журнале сервера видим ошибку:
Ошибка в скрипте ... Access violation at address ... Write of address ...
Результат. Пока нету.
Можете проверить у себя. Возможно более подробно осветить тему использования массивов в процедурах и функциях глобального модуля (но вроде в руководстве не нашел)?
Возможно у Вас есть более простой вариант решения.
Жду вопросов и предложений
Здравствуйте.
Работа со статическим массивом. Глобальный модуль:
interface
type
// объявляем тип статического массива на 3 элемента
TStaticArray = array[1..3] of single;
var
// глобальный массив, который будем передавать как параметр
ArrayAsParam: array[1..3] of single = (0, 6.8, 10.3);
function sum_array(const arr: TStaticArray): single;
implementation
// возвращает сумму элементов массива
function sum_array(const arr: TStaticArray): single;
var
I: Integer;
begin
Result := 0;
for I := Low(arr) to High(arr) do
Result := Result + arr[i];
end;
end.
Использование. Скрипт нажатия на кнопку:
var
aRes: Single;
begin
aRes := sum_array(ArrayAsParam);
// далее работаем с результатом aRes
end.
Работа с динамическим массивом. Глобальный модуль:
interface
function sum_array_dyn(const arr: array of single): single;
implementation
// возвращает сумму элементов массива
function sum_array_dyn(const arr: array of single): single;
var
I: Integer;
begin
Result := 0;
for I := 0 to Length(arr) do
Result := Result + arr[i];
end;
end.
Использование. Скрипт нажатия на кнопку:
var
aRes: Single;
testArray: array of Single;
begin
SetLength(testArray, 3); // выделяем память под три элемента
testArray[0] := 0;
testArray[1] := 6.8;
testArray[2] := 10.3;
aRes := sum_array_dyn(testArray);
// далее работаем с результатом aRes
end.