PDA

Просмотр полной версии : применение указателей



Дмитрий Артюховский
17.04.2015, 21:15
В глобальных переменных объявлен байтовый массив. Объявлено несколько указателей, так же глобально. При старте программы им присваивается адреса элементов массива. Пока указателей было 3 - все работало, когда добавил еще пяток - ПЛК стал перезагружаться по ватчдогу. К моменту перезагрузки запись по указателям еще не производилась.

Че бы так?


BUF: array[0..511] of byte;

P_COUNT: pointer to dint;

......

p_count := ADR( buf[ 100] );

lara197a
17.04.2015, 21:36
Если сделать не через указатель, а к примеру [N]
и присваивать через номер в массиве, то все работает и проще пишется-читается.
Например:
Out_arx_D1:=ARX[N];
Out_arx_D2:=ARX[N];
Out_arx_D3:=ARX[N];

Дмитрий Артюховский
17.04.2015, 22:16
да понятно что работает, идея кода с указателями в том, что есть куча переменных, которые нужно периодически сбрасывать в сокет, для этого их приходится вписывать в буфер, ну а если хранить переменный в этом самом куске памяти - зарезервированного под буфер, то экономится прилично процессорного времени

capzap
18.04.2015, 04:43
ну а вдруг дело в использовании знакового типа данны, так то везде используют dword

lara197a
18.04.2015, 07:53
ну а вдруг дело в использовании знакового типа данны, так то везде используют dword
Соглашусь, обычно указывают размер, а не тип.
И хотел бы заметить, что в свое время имел разговор по поводу указателей с уважаемым И.Петровым.
Он крайне не рекомендовал использовать указатели и по возможности в программах обходиться без них. Почему- тема долгая, но вот как-то так.

Yegor
18.04.2015, 11:52
ПЛК стал перезагружаться по ватчдогу.Доступ по некратному адресу. Если вы пытаетесь разыменовать указатель на DINT, то адрес под указателем должен быть кратным четырём, иначе собака. На ПЛК Овен поперёк выравнивания не попрёшь. Буферы для передачи и приёма через сеть собирайте функциями библиотеки SysLibMem. Я предыдущий свой пост писал в такую же тему (http://owen.ru/forum/showthread.php?t=21078).

Дмитрий Артюховский
18.04.2015, 19:10
Доступ по некратному адресу. Если вы пытаетесь разыменовать указатель на DINT, то адрес под указателем должен быть кратным четырём, иначе собака. На ПЛК Овен поперёк выравнивания не попрёшь. Буферы для передачи и приёма через сеть собирайте функциями библиотеки SysLibMem. Я предыдущий свой пост писал в такую же тему (http://owen.ru/forum/showthread.php?t=21078).

да, причина в этом, СПАСИБО!

amn
09.02.2016, 17:57
Что-то я затупил. Не могу через указатель в байтовую переменную записать структуру 8 бит.
22534
Правильно пишется только первый бит, остальные нули.

Yegor
09.02.2016, 18:01
Потому что структура у вас не 8 бит, а 8 байт — булевые переменные занимают каждая целый байт и не уплотняются в биты сами по себе.

amn
09.02.2016, 18:07
Вот облом. Спасибо Егор.