Долго искал и не как не могу понять как на языке SCL понять что кончился массив, попробую пояснить:
например есть оператор цикла WHILE DO в котором параметр продолжения цикла выступает массив с индексом i -> X значение индекса меняется внутри цикла и точное количество итераций заранее не известно (так как массив X передается в в блок из другого источника в виде входящих данных) , но известно что как только "I" превысит количество значений в массиве нужно закончить цикл.
Как я понимаю должно быть что-то типа запись ПризнакКонецМассива(X), в VBA эта команда записывается как EOF(X) и она может принимать значения False/true
WHILE EOF(X) DO
....;
END_WHILE;
Так вот вопрос как это записать на SCL? Что бы получать признак конца массива ?
PS
По сути команда EOF() сообщает возможно ли получить данные из указанного элемента, если данные прочитать можно то TRUE, а если нет то False.
Как определить конец массива?
Re: Как опредеть конец массива?
А в SCL можно описать именно массив неизвестной длины? Как?
И еще передать такой массив в FC или FB?
Есть еще типы POINTER и ANY - почитайте руководство - там длина передается и можно ее получить.
И еще передать такой массив в FC или FB?
Есть еще типы POINTER и ANY - почитайте руководство - там длина передается и можно ее получить.
Re: Как опредеть конец массива?
Я немного о другом спрашиваю, речь о том как понять что кончился массив? или например указанной переменной не существует?POV писал(а):А в SCL можно описать именно массив неизвестной длины? Как?
И еще передать такой массив в FC или FB?
Есть еще типы POINTER и ANY - почитайте руководство - там длина передается и можно ее получить.
У меня на самом деле размер массива известен конечно но в дальнейшем измениться и не хочется потом вспоминать копаться в коде и менять все зависящие от этого параметры.
Re: Как определить конец массива?
Попробуйте такой код:
array_tag - массив Array[lo..hi] of Type
variant_tag - переменная типа вариант Variant
length - тип UDINT
А вообще проще при каждом изменении размера массива сохранять новую длину сразу в переменную length.
Код: Выделить всё
VariantPut(SRC := #array_tag,
DST := #variant_tag);
#length:=CountOfElements(#variant_tag);
variant_tag - переменная типа вариант Variant
length - тип UDINT
А вообще проще при каждом изменении размера массива сохранять новую длину сразу в переменную length.
Re: Как определить конец массива?
А секция констант в описании не спасет?
Количество элементов массива и все циклы до описанной константы - поменяли константу - рекомпилировали - все ОК?
Количество элементов массива и все циклы до описанной константы - поменяли константу - рекомпилировали - все ОК?
Re: Как определить конец массива?
В TIA портал есть специальные функции для определения нижней и верхней границы. Дома запускать не буду, это занятия не для слабонервных, а вот завтра на работе посмотрю, если интересно.
Re: Как определить конец массива?
Ну как то так.
Код: Выделить всё
FOR #i := LOWER_BOUND(ARR:=#A, DIM:=1) TO UPPER_BOUND(ARR:=#A, DIM:=1) DO
#B[#i]:= #A[#i] + #X;
END_FOR;
Re: Как определить конец массива?
Единственно, что хочу предупредить. В 1200 это хрень работает плохо. Т.е. сами функции работают хорошо, и все хорошо определяют. Но если массив используется как параметр (тир array[*]) - то почему то обрабатывается только 1-й элемент массива.
В 1500 все работает хорошо и правильно.
В 1500 все работает хорошо и правильно.