Цитата Сообщение от slonegd Посмотреть сообщение
Вкратце. Все переменные лежат в памяти контроллера определенным образом. Когда мы пишем iVar:=128. Мы записываем в ячейку памяти, к которой привязано имя этой переменной число 128. Это для машины, человеку удобнее пользоваться именем переменной. Функция adr(iVar) возвращает как раз адрес этой переменной. Если вы в функциональный блок передали адрес переменной, а не переменную, то меняя её внутри блока (там свои правила написания через указатели тогда), вы меняете её именно в этой ячейке памяти, а не её копию внутри блока, а значит меняешь внутри - меняется и снаружи. Подобное поведение и у var_in_out, рекомендую пользоваться именно var-in-out, ошибок будет меньше.
Указатели необходимы, к примеру, для создания функций работы с массивами. Только с помощью указателей можно написать универсальную функцию, к которой не привязан конкретный размер массива. В функцию надо передать указатель на первую ячейку массива с помощью ADR() и его размер с помощью SIZEOF() (еще и SIZEOF() ячейки массива - но это уже детали реализации). var-in-out для этого не подходит, потому что необходимо указывать размер массива в описании этого массива, а значит для массивов разной длины будет своя функция.
Попробуйте написать функцию сортировки массива с любыми целочисленными типами данных, где размер массива может быть любой, не используя указатели.
Спасибо Вам что рассказали мне как работает эта функция и что она делает. Основная суть ясна. Получается эта функция применяется чтобы изменить значение регистра в котором хранится значение нашей переменной? А если просто присвоить ей значение она ведь тоже изменится. В чем разница не могу понять...
Программа сортировки массива (это вырезка из основной программы):
VAR
POINT:ARRAY[1..20] OF REAL := 2,10,10,65,1,1,17,10,2,4,6,7,1,10,54,1,2,35,0,21;
SORT_POINT:ARRAY[1..20] OF REAL;
B:WORD;
B_MAX:WORD := 19;
X:REAL;
END_SORT:BOOL;
END_VAR
WHILE NOT END_SORT DO
B := B + 1;
IF B >=1 AND B <= B_MAX THEN
IF SORT_POINT[ B ] >= SORT_POINT[ B+1] THEN
X := SORT_POINT[ B +1 ];
SORT_POINT[ B +1 ] := SORT_POINT[ B ];
SORT_POINT[ B ] := X;
END_IF
ELSIF B >= B_MAX THEN
IF B_MAX > 0 THEN
B_MAX := B_MAX - 1;
ELSE
END_SORT := TRUE;
B_MAX := 19;
END_IF
B := 0;
END_IF
END_WHILE