关于C#调用指针API需要用到FIXED定义变量数组的问题

ni_vision 2016-08-03 09:02:30
因为要调用C++的API需要指针所以定义了一个结构体
UNSAFE PUBLIC STRUCT VCI_CAN_OBJ //定义不安全结构体
{
public DataLen;
public fixed byte Data[8];
public fixed byte Reserve[3];
}
因为调用API是参数是该结构体数组所以函数中定义结构体数组如下
VCI_CAN_OBJ[] m_sendOBJ = NEW VCI_CAN_OBJ[50];
然后在函数中初始化该结构体数组中的数组成员如下
for(int i=0;i<50;i++)
{
.....
m_sendOBJ[i][0] = 0x00; //定义结构体数组中数据数组第一个的初值,这是初始化第一个数后面还有很多,在这里出现问题
......

}

初始化结构体数组中的FIXED数组提示错误如下:you cannot use fixed size buffers contained in unfixed expressions ,try using the fixed statement.
感觉是说结构体数组不是FIXED类型,不能包含FIXED 数组。。不是特别清楚,如果不定义结构体数组单独定义一个结构体,初始化又没问题。如
VCI_CAN_OBJ msendobj = new VCI_CAN_OBJ
其他相同给他的FIXED数组成员赋初值又没问题
msendobj.Data[0] = 0x00; //改FIXED数组赋初值通过?想问错误到底是为什么,为什么定义结构体数组就有问题,上面错误如何解决?
...全文
586 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ni_vision 2016-08-04
  • 打赏
  • 举报
回复
6楼谢谢!我就是因为调用API的时候 需要传入指针参数才用的FIXED啊。
秋的红果实 2016-08-04
  • 打赏
  • 举报
回复
用到指针时才需要fixed,固定指针指向的地址,防止CRL换地址或回收,而不是放到声明变量前 可以改成这样

unsafe public struct VCI_CAN_OBJ
{
    public int DataLen { set; get; }
    public byte[] Data { set; get; }
    public byte[] Reserve { set; get; }

}

//初始化
VCI_CAN_OBJ[] VCArr=new VCI_CAN_OBJ[10];
byte[] d={65,66,67};
byte[] r={48,49};
VCArr[0].DataLen = 1024;
VCArr[0].Data = d;
VCArr[0].Reserve = r;

//VCArr[1].DataLen = 1024;
//……

//要保证VCArr每个元素都被初始化

关于fixed,个人理解是这样的,例如

fixed(byte* p=&VCArr[0].Data[1])
{
     //使用指针变量p做些什么事;
     //在p的{}范围内,不会被CRL换地址
}

ni_vision 2016-08-04
  • 打赏
  • 举报
回复
3楼改为CLASS不行,改成CLASS后会提示FIXED只能用在STRUCT结构体中
ni_vision 2016-08-04
  • 打赏
  • 举报
回复
我现在的理解是FIXED修饰的2个固定内存的变量不应该被内存不固定的结构体数组包括,那么有什么办法定义内存固定的结构体数组呢?
ni_vision 2016-08-04
  • 打赏
  • 举报
回复
2楼谢谢,我知道意思,只是不知道要怎么改,把结构体数组也改成FIXED吗。 3楼谢谢 程序都是用C#
秋的红果实 2016-08-04
  • 打赏
  • 举报
回复
你将结构体改为class,我记得C#里,结构体数组不可用! 另外, UNSAFE PUBLIC STRUCT VCI_CAN_OBJ //定义不安全结构体 { public DataLen; public fixed byte Data[8]; public fixed byte Reserve[3]; } 这是C++的结构定义吧,不是C#的

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧