我认为您不能在初始化第三个数组时加入数组(请参阅下面的编辑)。然而,你可以做的是在程序开始时调用一个函数,一旦加入这两个数组:
PROGRAM PLC_PRG
VAR
arr1: ARRAY [0..2] OF INT := [1, 2, 3];
arr2: ARRAY [0..2] OF INT := [4, 5, 6];
arr3: ARRAY [0..5] OF INT;
initialized: BOOL := FALSE;
END_VAR
IF (NOT initialized) THEN
initialized := TRUE;
JOIN_INT_ARRAYS(arr1 := arr1, arr2 := arr2, dest_arr := arr3);
END_IF
// Assume that:
// - the destination ARRAY size can fit all source ARRAYs
// - all ARRAYs store INTs
FUNCTION JOIN_INT_ARRAYS
VAR CONSTANT
size_of_int: DWORD := SIZEOF(INT);
END_VAR
VAR_IN_OUT
arr1: ARRAY [*] OF INT;
arr2: ARRAY [*] OF INT;
dest_arr: ARRAY [*] OF INT;
END_VAR
VAR
arr1_len: DWORD := DINT_TO_DWORD(UPPER_BOUND(arr1, 1) - LOWER_BOUND(arr1, 1) + 1) * size_of_int;
END_VAR
MEMUtils.MemCpy(pbySrc := arr1, pbyDest := dest_arr, dwSize := arr1_len);
MEMUtils.MemCpy(pbySrc := arr2, pbyDest := dest_arr + arr1_len, dwSize := DINT_TO_DWORD(UPPER_BOUND(arr2, 1) - LOWER_BOUND(arr2, 1) + 1) * size_of_int);
结果:
需要注意的几点:
- 我使用
MemCpy
了MEMUtils
库中的函数。如果您没有它,或者不想将它添加到您的项目中,您可以使用FOR
循环手动将值从一个数组复制到另一个数组。
- 我省略了范围检查,这可能非常危险。如果您想要额外的保护,请自行添加。
- 避免
arr_dest
作为arr1
or传递arr2
。尝试从数组复制到自身可能会导致问题。
编辑:
实际上,这似乎有效:
integers: ARRAY [0..1] OF ARRAY [0..2] OF INT := [[2, 4, 6], [1, 3, 5]];
evenNumbers: ARRAY [0..2] OF INT := integers[0];
oddNumbers: ARRAY [0..2] OF INT := integers[1];
结果:
但我不知道这是否是你想要的结果。如果你想要一个连续数组作为组合数组,那么你可以试试这个:
// in Program
evenNumbers: ARRAY [0..2] OF INT := [2, 4, 6];
oddNumbers: ARRAY [0..2] OF INT := [1, 3, 5];
integers: ARRAY [0..5] OF INT := JOIN_INT_ARRAYS_3_3_6(arr1 := evenNumbers, arr2 := oddNumbers);
// (left)3 + (right)3 = (result)6
FUNCTION JOIN_INT_ARRAYS_3_3_6 : ARRAY [0..5] OF INT
VAR_IN_OUT
arr1: ARRAY [0..2] OF INT;
arr2: ARRAY [0..2] OF INT;
END_VAR
VAR
i: USINT;
END_VAR
FOR i := 0 TO 2 DO
JOIN_INT_ARRAYS_3_3_6[i] := arr1[i];
END_FOR
FOR i := 0 TO 2 DO
JOIN_INT_ARRAYS_3_3_6[i + 3] := arr2[i];
END_FOR
结果:
但是,这种方法不能通用,所以每次条件变化都得修改它的输入输出数组大小,如果你想在多个地方使用它,就创建很多,这样不优雅,而且我个人会避免它,但如果这对你有用,那么就在这里。
此外,这似乎给了我一个C0441: Access to uninitialized VAR_IN_OUT variable
警告,所以另一个尝试避免它的理由。