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

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Спасибо большое. Теперь понятно. Массив указателей никак не привязывается к индексам массива, на который ссылается.
    А можно каким-либо образом сделать, чтобы ptCol[28] указывал на GVL.astCol_5[28], а ptCol[49] - на GVL.astCol_8[49]?

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,234

    По умолчанию

    Цитата Сообщение от Paha1977 Посмотреть сообщение
    Спасибо большое. Теперь понятно. Массив указателей никак не привязывается к индексам массива, на который ссылается.
    А можно каким-либо образом сделать, чтобы ptCol[28] указывал на GVL.astCol_5[28], а ptCol[49] - на GVL.astCol_8[49]?
    Через ARRAY [..] OF POINTER TO circuit.
    Но, на мой взгляд, это выглядит довольно сомнительным решением.
    Впрочем, саму задачу вы так и не описали, так что сложно о чем-то рассуждать.

  3. #3

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Через ARRAY [..] OF POINTER TO circuit.
    Спасибо за подсказку. Так работает.
    Код:
    PROGRAM PLC_PRG
    VAR
    	iNC :INT; //номер контура
    	iSD :INT; //номер элемента массива в SlaveData
    	
    	ptCol :ARRAY [28..54] OF POINTER TO circuit;
    	ptrCol :ARRAY [28..54] OF POINTER TO circuit_ret;
    
    	astCol_5 :ARRAY [28..37] OF circuit;
    	astCol_8 :ARRAY [49..54] OF circuit;
    	
    	stSlaveData: slave_data;
    END_VAR
    
    VAR RETAIN
    	astrCol_5 :ARRAY [28..37] OF circuit_ret;
    	astrCol_8 :ARRAY [49..54] OF circuit_ret;
    END_VAR
    
    iSD:=0;
    FOR iNC:=28 TO 37 DO
    	ptCol[iNC]:= ADR(astCol_5[iNC]);
    	ptrCol[iNC]:= ADR(astrCol_5[iNC]);
    	PLC_PRG.CONTR_CIRC();
    END_FOR
    
    FOR iNC:=49 TO 54 DO
    	ptCol[iNC]:= ADR(astCol_8[iNC]);
    	ptrCol[iNC]:= ADR(astrCol_8[iNC]);
    	PLC_PRG.CONTR_CIRC();
    END_FOR
    Разыменование теперь, естественно, выглядит иначе.
    Код:
    rInput:=ptCol[iNC]^.rOutInPercent
    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Это не задача. Это выбранное вами решение.
    Но, в любом случае, не проще ли в структуру добавить поле с "номером физической установки", и сделать прозрачную нумерацию массивов? (с 0 или 1)
    Согласен, когда речь идет о разовом проекте. Когда таких шкафов более 60 и различаются они только количеством и порядковыми номерами устройств, а алгоритмы для каждого одинаковы, есть желание задуматься об удобстве и унификации.
    Последний раз редактировалось Paha1977; 06.03.2023 в 20:02.

Похожие темы

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

Ваши права

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