我需要更改数组dynamically.Right的长度,现在代码如下所示:
VAR
arrData : ARRAY[1..200] OF INT;
length : INT := 200;
END_VAR
数组的大小取决于长度variable.Here,length
变量的值可以在运行时使用VISU(gui)进行更改。因此,如果我更改length
=180个的值,那么20个字节的arrData
就是unused.Is,有一种方法可以将数组声明为与c++中的向量相似的可变长度,这样就可以在声明期间而在运行时分配内存。
编辑:如何安全地释放内存?
PROGRAM MAIN
VAR
arrData : POINTER TO INT;
length : INT := 200; // can be changed at runtime
bNew : BOOL := TRUE;
oldLength : INT; // to hold the old length variable
isInit : BOOL := FALSE;
END_VAR
IF NOT isInit THEN
oldLength := length; // initialise only once
isInit := TRUE;
END_IF
// if length is changed during runtime then delete the array
IF oldLength <> length THEN
IF arrData <> 0 THEN
__DELETE(arrData);
bNew := TRUE;
END_IF
oldLength := length;
END_IF
// during the first run or when the length is changed
IF bNew THEN
arrData := __NEW(INT,length);
bNew := FALSE;
END_IF
// deallocate the memory when the MAIN program goes out of scope
// as we are not deleting the array when the length variable is not
// changed during runtime
END_CASE
发布于 2022-10-25 17:35:38
这样做的方法是使用__NEW
新印孚瑟斯
pMyPointer := __NEW(INT, length);
__NEW
将返回指向数组的第一个元素的指针。您可以通过偏移此指针来访问后一个元素。
您可以通过比较此周期和前一个周期中的值来检查length
是否已更改。如果是这样,请将旧数组__DELETE
并初始化一个新数组。
编辑:
我认为,当TwinCAT运行时停止时,您就会得到错误,因为__NEW
分配的内存在这一点上没有被释放。
您的代码不应该放在程序(PRG
)中,而应该放在函数块(FB
)中。原因是您需要实现FB_exit
方法(当FB实例被销毁时,即像激活配置那样停止TwinCAT运行时,此方法被隐式调用)。据我所知,PRG
没有等效的方法。
为此,请执行以下操作:
FB
,实例化它并在您的MAIN
中调用它,并将代码从MAIN
移动到FB
FB_exit
添加一个FB
方法。准确命名是至关重要的FB_exit
方法中,编写以下代码:IF __ISVALIDREF(arrData) THEN
__DELETE(arrData);
END_IF
每次停止运行时并释放内存时,都会调用此方法。
与Infosys的链接:
pMyPointer <> 0
,但更易读https://stackoverflow.com/questions/74197624
复制相似问题