Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Серега от 18 Ноября 2021, 17:21:41

Название: Опять массивы
Отправлено: Серега от 18 Ноября 2021, 17:21:41
Добрый день!
Задача. Есть набор статических данных(меток). Фиксированное положение и не меняется. Объект выдает свое положение. Если находиться рядом с одной из меток зафиксировать сей факт(например увеличить значение переменной на 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 ...
Результат. Пока нету.
Можете проверить у себя. Возможно более подробно осветить тему использования массивов в процедурах и функциях глобального модуля  (но вроде в руководстве не нашел)?
Возможно у Вас есть более простой вариант решения.
Жду вопросов и предложений

Название: Re: Опять массивы
Отправлено: Simple-Scada от 18 Ноября 2021, 17:56:28
Здравствуйте.

Работа со статическим массивом. Глобальный модуль:
Код: (delphi)
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.
Использование. Скрипт нажатия на кнопку:
Код: (delphi)
var
  aRes: Single;
begin
  aRes := sum_array(ArrayAsParam);
  // далее работаем с результатом aRes
end.


Работа с динамическим массивом. Глобальный модуль:
Код: (delphi)
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.
Использование. Скрипт нажатия на кнопку:
Код: (delphi)
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.
Название: Re: Опять массивы
Отправлено: Серега от 19 Ноября 2021, 10:22:10
Добрый день!
Товарищи ну Вы шустрые! +100500 респекта.
Все заработало.
Спасибо!