如何确定指针索引成员的类型



如何确定指针索引成员的类型。我打算使用:

TYPE DUT_DemoStruct :
STRUCT
Member_1: BOOL;
Member_2: INT;
END_STRUCT
END_TYPE

PROGRAM Prg_Main
VAR
DemoStructPointer:
Obj_DemoStruct1: DUT_DemoStruct ;
Obj_DemoStruct2: DUT_DemoStruct ;
Obj_DemoStruct3: DUT_DemoStruct ;
Demo_INT: INT;
Index: INT;
_pointer: POINTER TO DUT_DemoStruct;
END_VAR

FOR Index:=0 TO 5 DO
IF _pointer[Index] THEN  //whether the _pointer[Index] (pointer index member) is of type DUT_DemoStruct
_pointer[Index].Member_1:=TRUE;
END_IF;
END_FOR;

另外,你有CheckPointer的应用案例吗?

编辑:2022-06-05

这是为了更好地实现HMSD(分层主从分布)框架的收缩部分。例如,批量初始化状态。例如:如果要批量初始化Step类的对象,只需要将第一个Step类的指针传递给初始化函数,函数就会根据第一个指针自动向下搜索,直到找到不属于Step类的对象并停止搜索。这个过程需要自动化。要实现这样的功能,需要指针的索引,并确定指针索引成员的类型。理想的代码:

FUNCTION_BLOCK Exe_PalletShuttle EXTENDS Frame.Base_LocalScope
VAR
{attribute 'hide'}pointer_Step: POINTER TO Frame.Base_Step;
{attribute 'hide'}step_Start: Frame.Base_Step;
{attribute 'hide'}step_StartRecharg: Frame.Base_Step;
{attribute 'hide'}step_LengthwaysMove_Start: Frame.Base_Step;
{attribute 'hide'}step_LiftShuttleCyd_PutDown: Frame.Base_Step;
{attribute 'hide'}step_LengthwaysMove_GoTarget: Frame.Base_Step;
{attribute 'hide'}step_LengthwaysMove_End: Frame.Base_Step;
{attribute 'hide'}step_WidthwaysMove_Start: Frame.Base_Step;
{attribute 'hide'}step_LiftShuttleCyd_Uplift: Frame.Base_Step;
{attribute 'hide'}step_WidthwaysMove_GoTarget: Frame.Base_Step;
{attribute 'hide'}step_WidthwaysMove_End: Frame.Base_Step;
{attribute 'hide'}step_UpliftPallet_Start: Frame.Base_Step;
{attribute 'hide'}step_LiftPalletCyd_Uplift: Frame.Base_Step;
{attribute 'hide'}step_UpliftPallet_End: Frame.Base_Step;   
{attribute 'hide'}step_PutdownPallet_Start: Frame.Base_Step;
{attribute 'hide'}step_LiftPalletCyd_Putdown: Frame.Base_Step;
{attribute 'hide'}step_PutdownPallet_End: Frame.Base_Step;  
{attribute 'hide'}step_End: Frame.Base_Step;
{attribute 'hide'}VividerMark: BOOL;
{attribute 'hide'}obj_PalletLiftCyd: Frame.Device_Actuator;
{attribute 'hide'}obj_DiverterLiftCyd: Frame.Device_Actuator;
END_VAR

pointer_Step: = ADR (step_Start);InitialStepScope (FirstAdr: = pointer_Step);感觉目前指针实现的机制,这样的功能似乎很难实现。期待收藏功能的推出

您无法知道指针所指向的数据类型。当你创建指针时,你是在显式地告诉编译器假设数据是指定的类型。

您可以存储第一个和最后一个元素的地址,并在它们之间迭代(尚未测试):

elem1: MY_STRUC;
elem2: MY_STRUC;
...
elemN: MY_STRUC;
pbegin: POINTER TO MY_STRUCT := ADR(elem1);
pend: POINTER TO MY_STRUCT := ADR(elemN);
WHILE pbegin <> pend DO
// use pbegin^
pbegin := pbegin + SIZEOF(pbegin^); // or pbegin := ADR(pbegin[1]);
END_FOR

但是,上面的假设是:

  • 所有elemX尺寸相同
  • 元素之间没有其他类型的变量
  • CODESYS中顺序定义的变量也必须以相同的顺序放置在内存中(不知道这是否正确)

因此,我认为上面很容易出错。更好的方法可能是"捆绑"。专用结构中的元素(在模拟器上测试):

TYPE MY_STRUC_BUNDLE:
STRUCT
elem1: MY_STRUC;
elem2: MY_STRUC;
...
elemN: MY_STRUC;
END_STRUCT
END_TYPE
bundle: MY_STRUC_BUNDLE;
ptr: POINTER TO MY_STRUCT := ADR(bundle);
len: UDINT := SIZEOF(bundle) / SIZEOF(ptr^) - 1;
index: UDINT;
FOR index := 0 TO len DO
// use ptr[Index]
END_FOR

假设束结构只有包含所需的相同类型(和大小)的结构体,这应该工作,因为结构体应该有一个连续的内存段。

我仍然认为,如果你想用索引访问普通变量,最好的、最不容易出错的解决方案是将它们绑定到一个数组中:

elem1: MY_STRUC;
elem2: MY_STRUC;
...
elemN: MY_STRUC;
arr: ARRAY [1..N] OF POINTER TO MY_STRUC := [ADR(elem1), ADR(elem2), ..., ADR(elemN)];
FOR Index := 1 TO N DO
// use arr[Index]^
END_FOR

最新更新