Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 30 из 30

Тема: ADR(%X.X) в указатель неверного типа — бип-бип и стоп

  1. #21
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

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

  2. #22
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Ровно то - что я написал
    p : pointer to int;
    P^ := 3.3;
    Повторюсь: выражение p^ не является указателем. КДС молча пройдёт через pointer_to_book := pointer_to_dog.
    Пока я в КДС мне абсолютно побоку что там в с++, в котором указатели нужно перекладывать через нетипизированные или там делать reinterpret_cast. Ой-ой, а ведь так хотелось сократить код используя GetPointer()^.DoSomething()
    Второе это отдельная проблема, не относящаяся к контролю типов указателей.
    Вам срочно нужно абстрагироваться от сишного программирования, в КДС указатели имеют отношение к областям памяти выраженной в байтах, к типам они привязаны только одним местом, это количеством байт. Как раз основная работа в КДС и заключается, чтоб с помощью указателей из типа большей емкости взять только часть и к примеру поменять местами для отправки по каналу связи двух регистров модбаса. Поэтому Ваше предложение информировать о таких не соответствиях меня бы стало сильно раздражать при работе с проектом
    ... и сюда же...
    Вы пришли в эту столовую, и о ужос - тут есть вилки, а ими можно выколоть себе глаз, и начинаете требовать чтоб их убрали.
    Когда вы делаете, скажем, DWORD_TO_INT, вас это сильно раздражает? Или кому-то обязательность таких преобразований кажется глупым запретом на вилки?

  3. #23
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    DWORD_TO_INT, вас это сильно раздражает?
    Нет, такое чуство ко мне не приходит, точно так же когда я пальчиками давлю на клавиатуру, я понимаю, что у меня указатель определенного типа и предложить ему переменную, я должен того же типа и если не помню какого, то перевожу взгляд в окно объявлений и смотрю на тип указателя

  4. #24
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Нет, такое чуство ко мне не приходит
    Не приходило бы и при явном приведении с указателями.
    я понимаю, что у меня указатель определенного типа и предложить ему переменную, я должен того же типа и если не помню какого
    В реальности помимо «помню-не помню» есть ещё «ошибаюсь». Потому и запрещено неявное преобразование DWORD в INT. А вот с указателями почему-то всё дозволено.
    Последний раз редактировалось Yegor; 16.02.2012 в 11:13.

  5. #25
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Если я делаю DWORD_TO_INT, то получаю только младшие байты, если я использую указатель то по моему желанию я могу из DWORD-а получить два старших байта для превращения их в INT, что не получится используя первую команду. Я сознательно иду на такой шаг и меня будет раздражать, когда компилятор меня будет информировать, что я не правильно поступаю.

  6. #26
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Он не будет информировать, т.к. в этом случае вы воспользуетесь явным преобразованием вроде DWORD_TO_INT, только для указателей.

  7. #27
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Например, если у вас есть функция, которая возвращает указатель определённого типа, то вы можете изменить тип этого указателя в определении функции, но забыть учесть это изменение там, где функция вызывается.
    создал функцию
    FUNCTION crash : POINTER TO DWORD
    VAR_INPUT
    uno : DWORD;
    END_VAR

    //***********
    crash:=ADR(uno);
    crash:=crash+2;
    в программе записал следующее
    duo:=crash(uno);
    x:=duo^;
    затем сменил crash : POINTER TO INT, результат выполнения тот же.

  8. #28
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Повторюсь тоже. Хотели несоответствие типов – получили.
    Как бы ещё-то сказать... Где в вашем примере присваивание указателя одного типа в переменную-указатель другого?
    Вы хоть читали устав местного монастыря ? Там четко и ясно : указатели – вне МЭК.
    Я где-то ссылался на стандарт? Да пускай хоть за три версты от него — единообразие всё равно должно быть.
    Давайте пойдем дальше
    Вы понеслись сломя голову, а не пошли.
    затем сменил crash : POINTER TO INT, результат выполнения тот же.
    Потому что памяти по-прежнему выделяется для DWORD. Кстати, в долгосрочной перспективе полученный указатель опасен, т.к. ссылается на освобождённый участок памяти (время жизни переменной uno).

  9. #29
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Потому что памяти по-прежнему выделяется для DWORD. Кстати, в долгосрочной перспективе полученный указатель опасен, т.к. ссылается на освобождённый участок памяти (время жизни переменной uno).
    Как бы тоже объяснить, я сменил не во время работы ПЛК, а остановив процесс, отрдактировав проект, загрузив по новой и память должна распределится уже исходя из новых условий, то что у меня удачно получилось именно в данном случае, этим я хотел показать что бывают моменты, когда компилятору не стоит выдавать сообщений потому что я знаю что делаю.

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

  10. #30
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    А что такое указатель ?
    p — указатель, p^ — не указатель

    Ладно, хватит. Ваша взяла. С указателями всё чики-пуки и ваще кодесис лапочька там всё ок.

Страница 3 из 3 ПерваяПервая 123

Похожие темы

  1. как логировать старт/стоп?
    от Ушаков Николай в разделе ПЛК1хх
    Ответов: 13
    Последнее сообщение: 18.01.2017, 11:42
  2. Ответов: 2
    Последнее сообщение: 13.01.2011, 15:47
  3. стоп плк
    от Дмитрий Прибытов в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 11.11.2010, 03:38
  4. бит через указатель
    от Freddy в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 20.07.2010, 09:08
  5. Ответов: 5
    Последнее сообщение: 02.04.2010, 10:05

Ваши права

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