Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 24

Тема: Pointer-константа: как инициализировать?

  1. #1
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию Pointer-константа: как инициализировать?

    Хочу сделать константный указатель на данные разных типов:

    Код:
    VAR_GLOBAL CONSTANT
    	VAR1: 		DWORD := 100;
    	Ptr1:		POINTER TO DWORD := ADR( VAR1);
    	Ptr2:		POINTER TO DWORD := ADR( VAR2);
    	Ptr3:		POINTER TO DWORD := ADR( VAR3);
    END_VAR
    VAR_GLOBAL RETAIN
    	VAR2:	 	DWORD := 1;
    END_VAR
    VAR_GLOBAL
    	VAR3:	 	DWORD := 1;
    END_VAR
    То есть, пойнтеры 1, 2 и 3 указывают на данные типа CONSTANT, RETAIN и обычные переменные. И эти пойнтеры по смыслу никогда не изменяются, т.е. представляют сами по себе данные типа CONSTANT.

    Как их инициализировать? Компилятор ругается на все три строчки:

    Неверное начальное значение

    Аналогичное присвоение в программе работает на ура. Ну, там просто функция подставляется ADR() и она все делает чики-пики.
    А как же компилятору сказать "адрес переменной VAR1"? Читаю и не нахожу...

    Спасибо!

  2. #2

    По умолчанию

    1) ADR - runtime функция. - вызывайте в программе
    2) По страшному секрету - финальная линковка программы идет в контроллере и ПЛК не известно таких наворотов как в линкерах больших компиляторов.
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  3. #3
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    то есть, в кдс присвоить указателю-константе значение адреса переменной в принципе нельзя?

  4. #4

    По умолчанию

    только хакерским трюком, сначала узнать адрес через Adr, а затем, циферками, его задать
    Указатели были "искусственно пришиты" к МЭК языкам. По хорошему их чем меньше используешь тем надёжнее программа.

  5. #5
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    понял, спасибо!

    использовать все же буду, но без хакерства у меня недостаточная квалификация для хакерства.

    в общем-то обходной маневр мне подсказали на этом форуме. только там получается, что целый массив структур с абсолютно известными и неизменными нормальному компилятору значениями всех элементов приходится размещать в озу и инициализировать после старта. это должно быть пофиг, но пока в проге есть баги, иногда приводит к неверной иницилизации. вот я и подумал, баги-то постепенно устраню (как говорится, до предпоследнего включительно), а прописать константный массив как-то надежнее.
    ну, не получилось

  6. #6
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,275

    По умолчанию

    Цитата Сообщение от филоненко владислав Посмотреть сообщение
    ... по хорошему их чем меньше используешь тем надёжнее программа.
    надежность кода зависит не от количества указателей, а от самого кодера.и если программа начинает жить загадочной жизнью, то хоть вообще выкинуть все поинтеры - загадки останутся.

  7. #7
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,275

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    а прописать константный массив как-то надежнее.
    ну, не получилось
    У меня в щите управления, с другой стороны стены, перфоратором контактор просверлили. А уж куда константнее.

    Все мнения о не "солидности" инициализации в коде - имхо мнения, мягко скажу, не уверенных в своем собственном коде.

  8. #8
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от валенок Посмотреть сообщение
    все мнения о не "солидности" инициализации в коде - имхо мнения, мягко скажу, не уверенных в своем собственном коде.
    зачем так категорично? я знаю мнение уважаемых мною программистов, которые говорят, что это "фи". иное дело, в чем чел работает. в яве нас бы засмеяли. если в кдс вот так уж есть, то куда ж деться. а стремиться к красоте нужно всегда, имхо.

    кстати, тут ветер рядом веял, напомнил мне о вашем споре по поводу работы со временем. вот и в связи с этим хочу заметить: а неплохо бы, чтобы в кдс была возможность инициализировать константный указатель. выносить в отдельную тему с заголовком "к и.петрову" я не буду, подожду, как он на временные споры отреагирует. но вообще - почему бы и нет? как-то же принимаются решения о внесении изменений. и обсуждения на форумах могут поспособствовать.

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    надежность кода зависит не от количества указателей, а от самого кодера.и если программа начинает жить загадочной жизнью, то хоть вообще выкинуть все поинтеры - загадки останутся.
    Вы не правы.
    Указатель - это адрес переменной. Переменная, на которую указывает указатель не поддается контролю ни в момент компиляции, ни в момент исполнения. Исключение - архитектура "Эльбрус"

    В этом суть проблемы. Мало кто перед каждым! использованием указателя проверяет его хотя-бы на NULL, не говоря уже о более сложных проверках. А для обычных переменных, с жестким адресом, все гораздо проще и надежнее.

    Для того, чтобы сделать указатель ну хоть как-нибудь контролируемым, придумали ссылки (по сути константный указатель без разименовывания) для статического контроля и всякие сложные вещи типа boost для динамического.
    Как говорится, и хочется, и колется.

  10. #10
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Вы не правы.
    Указатель - это адрес переменной. Переменная, на которую указывает указатель не поддается контролю ни в момент компиляции, ни в момент исполнения. Исключение - архитектура "Эльбрус"
    ...
    Как говорится, и хочется, и колется.
    Если нельзя, но очень хочется

    Не знаю я про Ваши Эльбрусы... Не понимаю, почему в принципе нельзя знать адрес переменной при компилировании (если уж точно, то при линковании) - и присвоить переменной, которую я объявил *имя (по-сишному), значение, равное адресу этой переменной. Если так делает Си, то почему НИЗЗЯ другим?
    Даже, если в ПЛК грузится перемещаемая программа - разве не выисляются в момент ее размещения истинные адреса всех данных?

    И, независимо от возможности того, о чем я только что сказал, объявление переменной (в данном случае - указателя) типом CONST вполне может помочь компилятору проконтролировать ситуацию, когда эту переменную-указатель кто-то пытается изменить. Ну, и нам сказать об этом. Т.е. объявление

    Код:
    VAR CONSTANT
    ptr: POINTER TO DWORD;
    END_VAR
    ...в этом именно смысле - полезно? Тогда почему не добавить возможность инициализации этого пойнтера?

    Прошу понять, я понял и принял, что в КДС такой возможности нет. Не могу понять, почему уважаемый Владислав пытается убедить нас, что это есть благо...

Страница 1 из 3 123 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •