首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

内部限制:构造太复杂或太大

2012-12-18 
内部限制:结构太复杂或太大? ? C#在调用c/c++动态库时,有时传入一个超大结构体数组时,运行时会报错: 内部

内部限制:结构太复杂或太大

? ? C#在调用c/c++动态库时,有时传入一个超大结构体数组时,运行时会报错: "内部限制:结构太复杂或太大"

?

// 结构体定义[StructLayout(LayoutKind.Sequential,Pack=1)]public struct hdata_element_t{public byte Valid;public float Value;}[StructLayout(LayoutKind.Sequential,Pack=1)]public struct group_reply_t{public int total;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 86400)]public hdata_element_t[] data;}// 调用声明[DllImport("cdata_engine.dll", EntryPoint = "GetGroupData")]public static extern void GetGroupData(ref PicRequest_t pRequest, ref group_reply_t groupVal);

?

? ?以上代码,group_reply_t这个结构体里面是一个包含一天数据的结构体数组(1s一个点),8万多个点作为传出参数,执行时报错. JNA调用时也没出现过这个问题,看来C#内部有限制. 既然引用不能解决问题,那就用IntPtr指针方式了

?

// 函数声明,用IntPtr作为传出参数public static extern int GetGroupData(ref PicRequest_t pRequest, IntPtr groupVal);// 调用 /** * 由于结构体太大,会报(内部限制:结构太复杂或太大),改用IntPtr来调用 */IntPtr ptr = IntPtr.Zero;int size = Marshal.SizeOf(typeof(group_reply_t));ptr = Marshal.AllocHGlobal(size); // 为指针分配空间GetGroupData(ref req, ptr);// 强制转化成原类型group_reply_t reply = (group_reply_t)Marshal.PtrToStructure(ptr, typeof(group_reply_t));for (int i = 0; i < 10; i++){Console.WriteLine("> 获取组值: 序号:{0} 质量位:{1} 数值:{2}",i,reply.data[i].Valid, reply.data[i].Value);}

?

? ?编译运行,一切OK. 看来以后遇到这种有指针作为参数的函数,在C#这边最好用IntPtr来代替

?

热点排行