Начнем с простого:Когда лопнет веревка, открываем литературу по ЛЮБЫМ языкам программирования, и изучаем типы, типытипы(и особенно - их размеры)... Пойду удавлюсь.
Не забываем что pointer - сам по себе тоже тип.
А pointer to что-то :
1.Директива компилятору - как использовать бессмысленный набор байтов по указанному адресу.
2.Вытекает из 1. и (ВНИМАНИЕ !) какое кол-во этих байтов
Ошибка 1. (Толстая)
pDWdest^:= word_to_dword( dword_to_word( pDWsour^)) +1;pDWsour := ADR(W); (* Source is wrong *)
...
pDWdest := ADR(DW2); (* Destin is right *)
...
pDWdest^ := pDWsour^ +1; (* DW <= W, fetch throu pDW *)
(word_to_dword конечно же избыточен,но показывает ход преобразований)
или проще
:= ( pDWsour^ and 16#0000_FFFF ) + 1;
Ошибка 2. (Тоньше 1.)
Опс. Здесь мы гробим pWsour. (Понятно как ?)VAR
......
W4: WORD;
pWsour: POINTER TO WORD;
pWdest: POINTER TO WORD;
END_VAR
pDWsour := ADR(W); (* Source is wrong *)
pWsour := ADR(DW);
pWdest := ADR(DW4); (* Destin is wrong *)
pDWdest := ADR(W4);
pDWdest^ := pDWsour^ +1; (* W <= W throu pDW *)
И в :
Пытаемся прочитать х.з. откуда, что иногда приводит к :pWdest^ := pWsour^ +1; (* DW <= DW throu pW *)
Доступ по несуществующему адресу. ПЛК остановленЕё-то Михалыч отремонтирует. А если б а.реактором ?(Слава Богу, что мы не управляли котельней!)
И если приспичило :
то придется применять проктологические методыpDWdest^[/U] := pDWsour^ +1
pDWdest^ := ( pDWdest^ and 16#FFFF_0000 ) or ( ( pDWsour^ + 1 ) and 16#0000_FFFF );
Сможете пояснить смысл этого действа ?
PS
Взяли на понт. Остались детки без подарков .......




