Показано с 1 по 9 из 9

Тема: Разыменование неверного указателя

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #4
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,808

    По умолчанию

    Ошибка на 54 элементе.
    Гораздо раньше.

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

    Заключается она в следующем.

    1. Тут вы обещаете компилятору, что на входы ptCol и ptrCol будут переданы адреса массивов, каждый из которых содержит 27 элементов:

    Код:
    	
    ptCol :POINTER TO ARRAY [28..54] OF circuit; //указатели на массив данных коллекторов
    ptrCol :POINTER TO ARRAY [28..54] OF circuit_ret; //указатели на массив retain данных коллекторов
    2. Но фактически в вызове вы передаете адреса массивов, содержащие 6 элементов.

    Код:
    	
    astCol_8 :ARRAY [49..54] OF circuit;
    astrCol_8 :ARRAY [49..54] OF circuit_ret;
    
    
    POU(
    	ptCol:= ADR(GVL.astCol_8), 
    	ptrCol:= ADR(GVL.astrCol_8), 
    	uiEnumStart:= 49, 
    	uiEnumEnd:= 54, 
    	uiStartStep:= uiStep 
    	);
    Что происходит в результате:

    ptCol[28] указывает на GVL.astCol_8[49]
    ptCol[29] указывает на GVL.astCol_8[50]
    ...
    ptCol[33] указывает на GVL.astCol_8[54]

    Аналогично с ptrCol.

    ptCol[34] / ptrCol[34] и далее указывают куда-то - в область памяти приложения, где хранятся какие-то другие данные.
    "Разыменование неверного указателя" - это когда вы "смотрите" по указателю на ячейку, где ожидаете BOOL (т.е. байт памяти со значение 0 или 1), а там хранится какое-то другое число (например, 123).

    Теперь вы спросите, почему проблемы только с 52-54 элементом.
    На самом деле, проблемы, как я уже сказал, начинаются с 34 элемента, просто увидите ли вы их или нет - зависит от того, как именно распределилась память при очередной компиляции.

    Открыв ваш проект, я выполнил полную перекомпиляцию, и после этого гораздо более отчетливо видно, в какой момент начинаются проблемы:

    2023-03-06_7-09-03.png

Похожие темы

  1. Как записать по адресу указателя?
    от Загнетов в разделе ПЛК1хх
    Ответов: 26
    Последнее сообщение: 12.01.2024, 04:34
  2. Инициализация указателя
    от drvlas в разделе ПЛК1хх
    Ответов: 17
    Последнее сообщение: 07.06.2016, 19:28
  3. Ответов: 29
    Последнее сообщение: 20.02.2012, 05:44

Ваши права

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