通过引用传递的输入变量的语义是什么?
What are the semantics of input variables passed by reference?
Beckhoff 的 TwinCat-3 以及它所基于的 Codesys 3 添加了引用作为对 IEC-61131-3 语言的扩展。我想知道这个非标准添加的确切语法和语义是什么(这就是它们的问题:没有人像标准那样费心记录它们)。
当从下面的 F_Test
测试函数中调用时,下面的 F_IsNonEmpty
函数是否有效并执行预期的操作?
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=
运算符初始化引用目标(v.s。例如引用目标不可变的 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
功能的人确认。
当您在 VAR_INPUT 中使用 REFERENCE 时,就好像您在使用 VAR_IN_OUT 变量一样。
否则,如果您在 VAR 部分中声明了 REFERENCE,则需要在为其分配另一个变量时使用 REF=(或出现异常)。
本质上,REFERENCE(如 VAR_IN_OUT var)是一个更方便的 "safe" 指针,因为不需要解引用运算符 ^ 并且在编译时检查类型。
Beckhoff 的 TwinCat-3 以及它所基于的 Codesys 3 添加了引用作为对 IEC-61131-3 语言的扩展。我想知道这个非标准添加的确切语法和语义是什么(这就是它们的问题:没有人像标准那样费心记录它们)。
当从下面的 F_Test
测试函数中调用时,下面的 F_IsNonEmpty
函数是否有效并执行预期的操作?
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=
运算符初始化引用目标(v.s。例如引用目标不可变的 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
功能的人确认。
当您在 VAR_INPUT 中使用 REFERENCE 时,就好像您在使用 VAR_IN_OUT 变量一样。 否则,如果您在 VAR 部分中声明了 REFERENCE,则需要在为其分配另一个变量时使用 REF=(或出现异常)。
本质上,REFERENCE(如 VAR_IN_OUT var)是一个更方便的 "safe" 指针,因为不需要解引用运算符 ^ 并且在编译时检查类型。