首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在twincat3中为数组分配可变长度

如何在twincat3中为数组分配可变长度
EN

Stack Overflow用户
提问于 2022-10-25 16:50:51
回答 1查看 115关注 0票数 2

我需要更改数组dynamically.Right的长度,现在代码如下所示:

代码语言:javascript
运行
复制
VAR
   arrData : ARRAY[1..200] OF INT;
   length  : INT := 200;
END_VAR

数组的大小取决于长度variable.Here,length变量的值可以在运行时使用VISU(gui)进行更改。因此,如果我更改length =180个的值,那么20个字节的arrData就是unused.Is,有一种方法可以将数组声明为与c++中的向量相似的可变长度,这样就可以在声明期间而在运行时分配内存。

编辑:如何安全地释放内存?

代码语言:javascript
运行
复制
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   
EN

回答 1

Stack Overflow用户

发布于 2022-10-25 17:35:38

这样做的方法是使用__NEW 新印孚瑟斯

pMyPointer := __NEW(INT, length);

__NEW将返回指向数组的第一个元素的指针。您可以通过偏移此指针来访问后一个元素。

您可以通过比较此周期和前一个周期中的值来检查length是否已更改。如果是这样,请将旧数组__DELETE并初始化一个新数组。

编辑:

我认为,当TwinCAT运行时停止时,您就会得到错误,因为__NEW分配的内存在这一点上没有被释放。

您的代码不应该放在程序(PRG)中,而应该放在函数块(FB)中。原因是您需要实现FB_exit方法(当FB实例被销毁时,即像激活配置那样停止TwinCAT运行时,此方法被隐式调用)。据我所知,PRG没有等效的方法。

为此,请执行以下操作:

  1. 创建一个新的FB,实例化它并在您的MAIN中调用它,并将代码从MAIN移动到FB
  2. 向此FB_exit添加一个FB方法。准确命名是至关重要的
  3. FB_exit方法中,编写以下代码:
代码语言:javascript
运行
复制
IF __ISVALIDREF(arrData) THEN
  __DELETE(arrData);
END_IF

每次停止运行时并释放内存时,都会调用此方法。

与Infosys的链接:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74197624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档