C#结构中如何定义数组

时间:2021-08-07 04:18:49
  public struct RETURN_OTDRip2
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string STPKSTR;//起始帧
            public UInt32 PKLEN;//总帧长
            public UInt32 REV;//版本号
            public UInt32 PKTPY;//帧类型
            public UInt32 SRC;//源地址
            public UInt32 DST;//目的地址
            public UInt32 PKID;//流水号
            public UInt32 RSVD1;//保留字节1
            public UInt32 CMDCODE;//命令码相应代码
            public UInt32 DATLEN;//数据长度
            public UInt32 datanum;
            public UInt16[] arr = new UInt16[CHANGDU];
            public UInt32 RSVD2;//保留字节2
        }
用的是这个程序,运行就会报错。

10 个解决方案

#1


结构成员在申明时不允许初始化,放到构造函数里做。

#2


2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

#3


引用 1 楼 D56233577 的回复:
结构成员在申明时不允许初始化,放到构造函数里做。

用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。

#4


引用 2 楼 feiyun_Web 的回复:
2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

#5


引用 3 楼 qq_36542187 的回复:
用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。


直接定义public UInt16[] arr;就行了

如果你不想用有参构造函数,也可以用对象初始化器。
var obj = new RETURN_OTDRip2() { arr = new UInt16[] { 1, 2, 3, 4, 5 } };

#6


引用 5 楼 D56233577 的回复:
Quote: 引用 3 楼 qq_36542187 的回复:

用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。


直接定义public UInt16[] arr;就行了

如果你不想用有参构造函数,也可以用对象初始化器。
var obj = new RETURN_OTDRip2() { arr = new UInt16[] { 1, 2, 3, 4, 5 } };

我如果想要定这个数组的长度呢?

#7


引用 5 楼 D56233577 的回复:
Quote: 引用 3 楼 qq_36542187 的回复:

用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。


直接定义public UInt16[] arr;就行了

如果你不想用有参构造函数,也可以用对象初始化器。
var obj = new RETURN_OTDRip2() { arr = new UInt16[] { 1, 2, 3, 4, 5 } };

如果我想定义这个数组的长度,用的就是里面的CHANGDU这个常量。

#8


加个类似这样的声明
[MarshalAs(UnmanagedType.ByValArray, SizeConst = CHANGDU)]
public fixed UInt16[] arr;

#9


引用 4 楼 qq_36542187 的回复:
Quote: 引用 2 楼 feiyun_Web 的回复:

2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

你是想做SOKCET结构体转换吧?

长度和类型那些,其实都是依赖特征做的,结构体只是定义,甚至不用什么uint16也是可以的,只要你的特征声明是对的。

参考#8

#10


引用 9 楼 feiyun_Web 的回复:
Quote: 引用 4 楼 qq_36542187 的回复:

Quote: 引用 2 楼 feiyun_Web 的回复:

2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

你是想做SOKCET结构体转换吧?

长度和类型那些,其实都是依赖特征做的,结构体只是定义,甚至不用什么uint16也是可以的,只要你的特征声明是对的。
对的,是做那个,可是用了那个上面所说的MASHUAL类之后我一开始的MARSHAL类就不能用了。

参考#8[/quot]
对的,可是我如果引用上面所说的MARSHAL类之前的那个MARSHAL类就不能用了

引用 9 楼 feiyun_Web 的回复:
Quote: 引用 4 楼 qq_36542187 的回复:

Quote: 引用 2 楼 feiyun_Web 的回复:

2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

你是想做SOKCET结构体转换吧?

长度和类型那些,其实都是依赖特征做的,结构体只是定义,甚至不用什么uint16也是可以的,只要你的特征声明是对的。

参考#8

是的,可是我用了上面所说的MARSHAL类之后,我事先用的MARSHAL类就不能用了,我那个是用来转换数据类型的。

#1


结构成员在申明时不允许初始化,放到构造函数里做。

#2


2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

#3


引用 1 楼 D56233577 的回复:
结构成员在申明时不允许初始化,放到构造函数里做。

用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。

#4


引用 2 楼 feiyun_Web 的回复:
2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

#5


引用 3 楼 qq_36542187 的回复:
用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。


直接定义public UInt16[] arr;就行了

如果你不想用有参构造函数,也可以用对象初始化器。
var obj = new RETURN_OTDRip2() { arr = new UInt16[] { 1, 2, 3, 4, 5 } };

#6


引用 5 楼 D56233577 的回复:
Quote: 引用 3 楼 qq_36542187 的回复:

用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。


直接定义public UInt16[] arr;就行了

如果你不想用有参构造函数,也可以用对象初始化器。
var obj = new RETURN_OTDRip2() { arr = new UInt16[] { 1, 2, 3, 4, 5 } };

我如果想要定这个数组的长度呢?

#7


引用 5 楼 D56233577 的回复:
Quote: 引用 3 楼 qq_36542187 的回复:

用这个可以吧
public fixed UInt16 arr[CHANGDU];
可是之后我如果想要引用它的话,该怎么引用呢?结构体名.arr?可是会报错啊。


直接定义public UInt16[] arr;就行了

如果你不想用有参构造函数,也可以用对象初始化器。
var obj = new RETURN_OTDRip2() { arr = new UInt16[] { 1, 2, 3, 4, 5 } };

如果我想定义这个数组的长度,用的就是里面的CHANGDU这个常量。

#8


加个类似这样的声明
[MarshalAs(UnmanagedType.ByValArray, SizeConst = CHANGDU)]
public fixed UInt16[] arr;

#9


引用 4 楼 qq_36542187 的回复:
Quote: 引用 2 楼 feiyun_Web 的回复:

2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

你是想做SOKCET结构体转换吧?

长度和类型那些,其实都是依赖特征做的,结构体只是定义,甚至不用什么uint16也是可以的,只要你的特征声明是对的。

参考#8

#10


引用 9 楼 feiyun_Web 的回复:
Quote: 引用 4 楼 qq_36542187 的回复:

Quote: 引用 2 楼 feiyun_Web 的回复:

2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

你是想做SOKCET结构体转换吧?

长度和类型那些,其实都是依赖特征做的,结构体只是定义,甚至不用什么uint16也是可以的,只要你的特征声明是对的。
对的,是做那个,可是用了那个上面所说的MASHUAL类之后我一开始的MARSHAL类就不能用了。

参考#8[/quot]
对的,可是我如果引用上面所说的MARSHAL类之前的那个MARSHAL类就不能用了

引用 9 楼 feiyun_Web 的回复:
Quote: 引用 4 楼 qq_36542187 的回复:

Quote: 引用 2 楼 feiyun_Web 的回复:

2楼正解。
= new UInt16[CHANGDU];

这个应该在构造函数里。

那我如果想要在结构中定义数组,该怎么实现呢?

你是想做SOKCET结构体转换吧?

长度和类型那些,其实都是依赖特征做的,结构体只是定义,甚至不用什么uint16也是可以的,只要你的特征声明是对的。

参考#8

是的,可是我用了上面所说的MARSHAL类之后,我事先用的MARSHAL类就不能用了,我那个是用来转换数据类型的。