Как определить конец массива?

Инженерное программное обеспечение
Ответить
obok
Любитель
Сообщения: 53
Зарегистрирован: 10 апр 2018, 20:16

Как определить конец массива?

Сообщение obok »

Долго искал и не как не могу понять как на языке SCL понять что кончился массив, попробую пояснить:

например есть оператор цикла WHILE DO в котором параметр продолжения цикла выступает массив с индексом i -> X значение индекса меняется внутри цикла и точное количество итераций заранее не известно (так как массив X передается в в блок из другого источника в виде входящих данных) , но известно что как только "I" превысит количество значений в массиве нужно закончить цикл.
Как я понимаю должно быть что-то типа запись ПризнакКонецМассива(X), в VBA эта команда записывается как EOF(X) и она может принимать значения False/true


WHILE EOF(X) DO
....;
END_WHILE;

Так вот вопрос как это записать на SCL? Что бы получать признак конца массива ?

PS
По сути команда EOF() сообщает возможно ли получить данные из указанного элемента, если данные прочитать можно то TRUE, а если нет то False.

POV
Специалист
Сообщения: 127
Зарегистрирован: 04 авг 2016, 16:28
Откуда: Нижний Новгород

Re: Как опредеть конец массива?

Сообщение POV »

А в SCL можно описать именно массив неизвестной длины? Как?
И еще передать такой массив в FC или FB?
Есть еще типы POINTER и ANY - почитайте руководство - там длина передается и можно ее получить.

obok
Любитель
Сообщения: 53
Зарегистрирован: 10 апр 2018, 20:16

Re: Как опредеть конец массива?

Сообщение obok »

POV писал(а):А в SCL можно описать именно массив неизвестной длины? Как?
И еще передать такой массив в FC или FB?
Есть еще типы POINTER и ANY - почитайте руководство - там длина передается и можно ее получить.
Я немного о другом спрашиваю, речь о том как понять что кончился массив? или например указанной переменной не существует?
У меня на самом деле размер массива известен конечно но в дальнейшем измениться и не хочется потом вспоминать копаться в коде и менять все зависящие от этого параметры.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как определить конец массива?

Сообщение Михайло »

Попробуйте такой код:

Код: Выделить всё

VariantPut(SRC := #array_tag,
           DST := #variant_tag);
#length:=CountOfElements(#variant_tag);
array_tag - массив Array[lo..hi] of Type
variant_tag - переменная типа вариант Variant
length - тип UDINT

А вообще проще при каждом изменении размера массива сохранять новую длину сразу в переменную length.

POV
Специалист
Сообщения: 127
Зарегистрирован: 04 авг 2016, 16:28
Откуда: Нижний Новгород

Re: Как определить конец массива?

Сообщение POV »

А секция констант в описании не спасет?
Количество элементов массива и все циклы до описанной константы - поменяли константу - рекомпилировали - все ОК?

petr2off
Любитель
Сообщения: 41
Зарегистрирован: 01 ноя 2018, 05:11

Re: Как определить конец массива?

Сообщение petr2off »

В TIA портал есть специальные функции для определения нижней и верхней границы. Дома запускать не буду, это занятия не для слабонервных, а вот завтра на работе посмотрю, если интересно.

petr2off
Любитель
Сообщения: 41
Зарегистрирован: 01 ноя 2018, 05:11

Re: Как определить конец массива?

Сообщение petr2off »

Ну как то так.

Код: Выделить всё

FOR #i := LOWER_BOUND(ARR:=#A, DIM:=1) TO UPPER_BOUND(ARR:=#A, DIM:=1) DO
 #B[#i]:= #A[#i] + #X;
END_FOR;

petr2off
Любитель
Сообщения: 41
Зарегистрирован: 01 ноя 2018, 05:11

Re: Как определить конец массива?

Сообщение petr2off »

Единственно, что хочу предупредить. В 1200 это хрень работает плохо. Т.е. сами функции работают хорошо, и все хорошо определяют. Но если массив используется как параметр (тир array[*]) - то почему то обрабатывается только 1-й элемент массива.
В 1500 все работает хорошо и правильно.

Ответить