Просмотр полной версии : применение указателей
Дмитрий Артюховский
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
да понятно что работает, идея кода с указателями в том, что есть куча переменных, которые нужно периодически сбрасывать в сокет, для этого их приходится вписывать в буфер, ну а если хранить переменный в этом самом куске памяти - зарезервированного под буфер, то экономится прилично процессорного времени
ну а вдруг дело в использовании знакового типа данны, так то везде используют dword
lara197a
18.04.2015, 07:53
ну а вдруг дело в использовании знакового типа данны, так то везде используют dword
Соглашусь, обычно указывают размер, а не тип.
И хотел бы заметить, что в свое время имел разговор по поводу указателей с уважаемым И.Петровым.
Он крайне не рекомендовал использовать указатели и по возможности в программах обходиться без них. Почему- тема долгая, но вот как-то так.
ПЛК стал перезагружаться по ватчдогу.Доступ по некратному адресу. Если вы пытаетесь разыменовать указатель на 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).
да, причина в этом, СПАСИБО!
Что-то я затупил. Не могу через указатель в байтовую переменную записать структуру 8 бит.
22534
Правильно пишется только первый бит, остальные нули.
Потому что структура у вас не 8 бит, а 8 байт — булевые переменные занимают каждая целый байт и не уплотняются в биты сами по себе.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot