TwinCAT中如何将已初始化数组赋值给二维数组
结论
你尝试的直接在变量声明块用已初始化的普通变量数组初始化二维数组的写法,在ST(结构化文本)语言规范下不可行。
原因
ST要求变量声明阶段的初始值必须是编译期可确定的常量表达式,你声明的evenNumbers、oddNumbers属于普通变量,哪怕已经绑定了常量初值,本质仍是运行时分配存储地址的变量,不属于合法的初始化常量,所以编译器会抛出「需要数组初始化值」的错误。
你尝试的[[evenNumbers], [oddNumbers]]写法报错,是因为多套了一层方括号:相当于试图给integers子数组内的INT类型元素赋值数组类型数据,类型不匹配自然触发转换错误。
可行实现方案
方案1:用常量数组初始化(保留可读性)
如果evenNumbers、oddNumbers不需要在运行时修改,可以将其定义为常量,常量属于编译期合法表达式,可以直接用于初始化二维数组:
PROGRAM ArrayInit VAR_CONSTANT evenNumbers : ARRAY[1..3] OF INT := [2, 4, 6]; oddNumbers: ARRAY[1..3] OF INT := [1, 3, 5]; END_VAR VAR integers : ARRAY[1..2] OF ARRAY[1..3] OF INT := [evenNumbers, oddNumbers]; END_VAR
方案2:运行阶段赋值(适用于子数组需要修改的场景)
如果evenNumbers、oddNumbers是需要运行时修改的普通变量,可以先声明二维数组不赋初值,在程序执行段直接整体赋值子数组:
PROGRAM ArrayInit VAR evenNumbers : ARRAY[1..3] OF INT := [2, 4, 6]; oddNumbers: ARRAY[1..3] OF INT := [1, 3, 5]; integers : ARRAY[1..2] OF ARRAY[1..3] OF INT; END_VAR // 程序逻辑段赋值 integers[1] := evenNumbers; integers[2] := oddNumbers;
ST原生支持同类型一维数组直接整体赋值,无需遍历元素,写法简洁且完全符合规范。
内容的提问来源于stack exchange,提问作者Roald
相关产品推荐
相关产品推荐

