Какова семантика входных переменных, передаваемых по ссылке? - PullRequest
1 голос
/ 01 октября 2019

Beckhoff TwinCat-3, а также Codesys 3, на которых он основан, добавляет ссылки в качестве расширения к языкам IEC-61131-3. Мне интересно, какова точная грамматика и семантика этого нестандартного дополнения (вот с ними проблема: никто не потрудится документировать их так же, как это сделает стандарт).

Если следующая функция F_IsNonEmpty действительнаи делать то, что и следовало ожидать, когда вызывается из тестовой функции F_Test ниже?

FUNCTION F_IsNonEmpty : BOOL
  VAR_INPUT
    text : REFERENCE TO STRING;
  END_VAR
  F_IsNonEmpty := LEN(text) > 0;
END_FUNCTION

FUNCTION F_Test1
  VAR
    testMessage : STRING := '123';
  END_VAR
  IF F_IsNonEmpty(text := testMessage) THEN
    {...}
  END_IF
END_FUNCTION

Учитывая, что цель ссылки должна быть инициализирована с использованием оператора REF= (vseg C ++, где ссылки целинеизменяемый), я ожидал, что следующий вызывающий код будет правильным, но он даже не скомпилируется:

FUNCTION F_Test2
  VAR
    testMessage : STRING := '123';
  END_VAR
  IF F_IsNonEmpty(text REF= testMessage) THEN
    {...}
  END_IF
END_FUNCTION

Кажется, что F_Test1 работает правильно, но я бы хотел кого-нибудькто на самом деле использует Codesys 3 или TwinCat-3 REFERENCE TO для подтверждения.

1 Ответ

1 голос
/ 02 октября 2019

Когда вы используете REFERENCE в VAR_INPUT, это как если бы вы использовали переменную VAR_IN_OUT. В противном случае, если вы объявляете вашу REFERENCE в разделе VAR, вам нужно использовать REF = при присвоении ей другой переменной (или получить исключение).

По сути, REFERENCE (например, VAR_IN_OUT var) является более удобными «безопасный» указатель, потому что оператор разыменования ^ не нужен и потому что тип проверяется во время компиляции.

...