Цитата Сообщение от Serhioromano Посмотреть сообщение
Можно примерчик указателя?
Кусочно-линейная аппроксимация http://www.owen.ru/forum/showthread....l=1#post220263
Код:
FUNCTION MyGraf_p : REAL
VAR_INPUT
	IN: REAL;	(*Входной сигнал*)
	pt : POINTER TO ARRAY[0..99] OF Point_GR;	(*Массив точек графика, не более 100 пар точек X,Y*)
	size : UINT;
END_VAR
VAR
	a: INT;	(*Начало интервала поиска*)
	b: INT;	(*Конец интервала поиска*)
	N: INT;	(*Число точек в графике*)
	i: INT;
END_VAR

N:= SHR(size,3)-1;	(*Число точек в графике*)
(*Начальные значения интнрвала поиска*)
a:=0;
b:=N-1;

(*Обрезание графика для крайних точек*)
IF IN<=pt^[0].X THEN
	MyGraf_p:=pt^[0].Y;
ELSIF IN>=pt^[N-1].X THEN
	MyGraf_p:=pt^[N-1].Y;
(*Теперь можно начать поиск*)
ELSE
	WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
	i:=(a+b)/2;	(*Делим интервал поиска пополам*)
	IF IN=pt^[i+1].X THEN	(*Может нам повезло, и мы сразу нашли точку? *)
	a:=i; b:=i+1;			(*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
	(*мимо :( ,тогда посмотрим в какую половину интервала попали*)
	ELSIF IN>pt^[i].X THEN	(*Если входной сигнал больше середины интервала поиска,*)
	a:=i;					 (*то следующий поиск будем делать начиная от середины и до конца массива*)
	ELSE					(*А если входной сигнал меньше середины интервала поиска,*)
	b:=i;					 (*то следующий поиск будем делать начиная от начала и до середины массива*)
	END_IF
(*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
для 8 точек графика нужно не более 3 итераций
при 9..16 точек в графике нужно не более 4 итераций
при 17..32 точек в графике нужно не более 5 итераций
при 33..64 точек в графике нужно не более 6 итераций
при 65..128 точек в графике нужно не более 7 итераций
инфа точная - 100% ;) *)
END_WHILE
(*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
MyGraf_p:=pt^[b].Y-(pt^[b].X-IN)*(pt^[b].Y-pt^[a].Y)/(pt^[b].X-pt^[a].X);
END_IF
Сам массив структур передается в функцию через указатель, по этому вызывать ее нужно так
MyGraf_p(IN, ADR(Имя_Массива), SIZEOF(Имя_Массива))

Например
Код:
PROGRAM PLC_PRG
VAR
	GR: ARRAY [0..49] OF Point_GR:=
	(X:=0, Y:=15),(X:=3, Y:=25),(X:=4, Y:=45),(X:=8, Y:=75),(X:=15, Y:=45),
	(X:=16, Y:=45),(X:=20, Y:=65),(X:=22, Y:=75),(X:=40, Y:=95),(X:=50, Y:=105),

	(X:=110, Y:=15),(X:=120, Y:=25),(X:=130, Y:=45),(X:=140, Y:=75),(X:=150, Y:=45),
	(X:=160, Y:=45),(X:=200, Y:=65),(X:=220, Y:=75),(X:=240, Y:=95),(X:=250, Y:=305),

	(X:=301, Y:=15),(X:=305, Y:=25),(X:=324, Y:=45),(X:=380, Y:=75),(X:=415, Y:=45),
	(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),

	(X:=511, Y:=15),(X:=515, Y:=25),(X:=524, Y:=45),(X:=580, Y:=75),(X:=615, Y:=45),
	(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),

	(X:=621, Y:=15),(X:=625, Y:=25),(X:=634, Y:=45),(X:=680, Y:=75),(X:=695, Y:=45),
	(X:=676, Y:=45),(X:=680, Y:=65),(X:=692, Y:=75),(X:=740, Y:=495),(X:=750, Y:=505);

	IN: REAL;
	OUT: REAL;
END_VAR
(*ВАЖНО!
Таблица должна быть обязательно отсортирована по X в порядке возрастания значений.*)

OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));