C# 结构体中定义数组

在调用C++ 的函数时,有时会碰到结构体含有数组的情况。这时就需要进行转换。


注意:
C++ 中long是32位,C# 是64位,如果原始类型是long,需要转成int类型。

typedef struct CrdPrm
{
	short dimension;
	short profile[8];
	double synVelMax;
	double synAccMax;
	short evenTime;
	short setOriginFlag;
	long originPos[8];
}TCrdPrm;

方法1 将数组按地址转写成元素

public struct TCrdPrm
{
     public short dimension;
     public short profile1;
     public short profile2;
     public short profile3;
     public short profile4;
     public short profile5;
     public short profile6;
     public short profile7;
     public short profile8;
     public double synVelMax;
     public double synAccMax;
     public short evenTime;
     public short setOriginFlag;
     public int originPos1;
     public int originPos2;
     public int originPos3;
     public int originPos4;
     public int originPos5;
     public int originPos6;
     public int originPos7;
     public int originPos8;
 }

这个方法使用上没问题,但是内部数组就不能批量赋值。

方法1 手动分配内存

 public  struct TCrdPrm
 {
      public short dimension;                              // 坐标系维数
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I2)]
      public short[] profile;                             // 关联profile和坐标轴 
      public double synVelMax;                             // 最大合成速度
      public double synAccMax;                             // 最大合成加速度
      public short evenTime;                               // 最小匀速时间
      public short setOriginFlag;                          // 设置原点坐标值标志,0:默认当前规划位置为原点位置;1:用户指定原点位置
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I4)]
      public Int32[] originPos;                            // 用户指定的原点位置

  }

注意:
使用时,需要额外对内部数组进行初始化,不然会报错。

TCrdPrm crdPrm = new TCrdPrm();
crdPrm.profile = new short[8];
crdPrm.originPos = new int[8];

方法三 固定内存(不推荐使用)

public unsafe struct TCrdPrm
{
	public  short dimension;
	public  fixed short profile[8];
	public  double synVelMax;
	public  double synAccMax;
	public  short evenTime;
	public  short setOriginFlag;
	public  fixed int originPos[8];
}

注意:
此方法使用时,需要使用unsafe代码,不安全,且调试的时候,无法监测到数组的值

 unsafe
{
   TCrdPrm1 crdPrm = new TCrdPrm1();
    crdPrm.dimension = 2;
    crdPrm.profile[0] = 1;
    crdPrm.profile[1] = 2;
    crdPrm.profile[2] = 3;
    crdPrm.profile[3] = 4;
    crdPrm.profile[4] = 5;
    crdPrm.profile[5] = 6;
    crdPrm.profile[6] = 7;
    crdPrm.profile[7] = 8;
 } 

C# 结构体中定义数组_第1张图片

你可能感兴趣的:(运动控制,c#)