Сообщение от
Igor.m
Подскажите где про указатели инфу найти можно, а то я так и не пойму как с ними работать.
http://ru.wikipedia.org/wiki/Указатель_(тип_данных)
Все тоже самое для любых языков ( кроме тех, где от указателей отказались принципиально)
Отдельного руководства по использованию указателей в CODESYS я не встречал, да оно и не особо нужно. Главное понять принцип работы с ним, а это можно по вышеприведенной ссылке.
Основное понятие: Указатель - это адрес ячейки памяти, одного байта, не зависимо от типа содержания в той ячейки.
Чтобы прописать или считать данные по адресу нужно обратиться по этому адресу c ^.
пример:
Код:
PROGRAM PLC_PRG
VAR
pX : POINTER TO BYTE;
pY : POINTER TO INT;
x : BYTE;
y : INT;
END_VAR
/*---------------------------------*/
pX := ADR(x);
pY := ADR(y);
pX^ := 1;
pY^ := 123;
первые две строчки получают адреса переменных x и y и записывают их в соответствующие указатели.
Далее по этим адресам мы записываем данные, которые отобразятся в переменных x и y (потому как указатели указывают на них);
Повторюсь любой указатель указывает только на 1 байт. тип (to int к примеру) приписывается только для того, чтоб кодесис знал сколько байт от этого указателя и далее брать для операци с ^. Это дает удобство в работе с ними, но также кроется опасность.
К примеру код:
pY := adr(x); не является не корректным, в этом случае указатели pX и pY будут ссылаться на один и тот же байт, где лежит значение переменной x. Но операция pY^ := N использует первый байт (где x лежит) и затрет следующий байт за ним, потому, что pY это указатель на int, а int имеет размер 2x байтов, следовательно операция pY^ будет использовать 2 байта от указателя. Така не аккуратность приводит к параличу программы.
Указатели на кусок памяти удобно использовать во многих случаях. Один из - передача больших массивов данных из одной функции в другую:
arr: array[1..10000] of LWORD; - массив 8* 10000 байт
передача параметром его в фунцию:
someFunction(arr); - приведет к копированию всех 80 000 байт, что займет длительное время.
передача же указателя :
pArr : pointer to byte;
sizeOfArr : uint := 80000;
pArr := adr(arr);
someFunction(pArr, sizeOfArr); - копирует всего 4 байта самого указателя и 2 байта размера, и при этом функция получает доступ к массиву в 80 000 байт.
Это наиболее распространенный, но все же частный случай использования указателя был выделен в кодесис в отдельную группу переменных VAR_IN_OUT, что по сути является скрытым использованием указателей при передачи больших объемов данных между POU.