Здравия всем! Решил отсортировать/найти максимальный/минимальный элемент массива и застрял! Для этого нету никаких функций?
Вид для печати
Здравия всем! Решил отсортировать/найти максимальный/минимальный элемент массива и застрял! Для этого нету никаких функций?
Набираем в поисковике "пузырьковая сортировка" ....
Юзаем oscat.lib, если хочется именно функции
http://www.oscat.de/
минимальный/максимальный можно одним перебором найти.
Да знаю я и пузырьковую сортировку.. Я вот, в пхп, например, люблю с массивами работать (http://www.php.ru/manual/ref.array.html) а в CDS вообще все так плохо. oscat.lib - смотрю! Благодарю!
фб _ARRAY_SORT (из библиотеки oscat.lib) требует два входных значения:
PT: POINTER TO ARRAY[1..32000]
SIZE: UINT
Я не знаю что туда передавать! Полагаю pointer, в данном случае, это не то, что возвращает функция ADR (возвращает 32 бита - DWORD), а _ARRAY_SORT требует на входе INT (и то кастрированный на 768).
В общем-то мне следует уточнить... В погоне за методами реализации я немного отошел от сути. Мне всего-то надо найти индексы минимального/максимального значения одномерного массива, состоящего из трех элементов - MhArr: ARRAY[1..3] OF REAL;
Ну так нашли ?
Валенок, всё гениальное просто)
MinI := 1;
FOR incr := 1 TO 3 DO
IF MhArr[incr] < MhArr[MinI] THEN
MinI := incr;
END_IF
END_FOR
И что мне было так заморачиваться...:D
Всем спасибо за советы. 7 лет спустя нашел вашу ветку.
пользовался http://www.drivesandsystems.com/code...-plc-programs/
и https://forum.codesys.com/viewtopic.php?t=8099
моя задача: передать процедуре (функции) массив, получить отсортированный массив
мое решение для Codesys2.3:
текст PLC_PRG
PROGRAM PLC_PRG
VAR CONSTANT
N:INT:=9;
END_VAR
VAR
arr1: ARRAY [0..N] OF INT := 399,288,1,4,5,6,7,8,9;
xRunSort:BOOL;
END_VAR
VAR CONSTANT
END_VAR
IF xRunSort THEN
sort2(ADR(arr1));
xRunSort := FALSE;
END_IF
текст функции Сортировки
FUNCTION sort2 : BOOL
VAR_INPUT
ptr:POINTER TO ARRAY [0..N] OF INT;
END_VAR
VAR
i,j:INT;
iTemp:INT;
iOne: INT;
iTwo: INT;
END_VAR
FOR j := 0 TO N-1 DO
FOR i:=0 TO N-j-1 DO
iOne:=ptr^[i];
iTwo:=ptr^[i+1];
IF iOne>iTwo THEN iTemp:= iOne; iOne:=iTwo; iTwo:=iTemp; END_IF
ptr^[i]:=iOne;
ptr^[i+1]:=iTwo;
END_FOR
END_FOR