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来代替
分享到:
相关推荐
- **提高安全性**:VLAN可以限制不同部门或区域之间的通信,提供一定的安全隔离。 - **简化管理**:通过VLAN,管理员可以更方便地管理和控制网络流量,提升网络效率。 6. **VLAN间的通信**: - **路由器的作用**...
但框架柱的尺寸较大,不太适合住宅使用,同时在地震区,高层框架结构的应用受到限制。 接着,剪力墙结构主要用于高层住宅和复杂房型的多层住宅,其优势在于混凝土墙体提供了极强的抗震性能,提高了建筑的安全度。...
但随着使用,发现链表的附加空间太高,内存碎片化问题也较为严重,因此Redis开发者们对列表数据结构进行了改造。 ### 知识点二:quicklist数据结构的出现 Redis的后续版本中,开发者用quicklist代替了ziplist和...
- 静态内部类可以在内部声明静态字段或方法,但这样做并没有太大的意义,因为静态内部类本质上是一个独立的类。 3. 内部类的访问规则 - 非静态内部类可以无限制地访问外部类的所有成员,包括私有成员。 - 静态内部...
- **缺点**: 结构复杂,可能导致大量的类。 16. **观察者模式** (Observer Pattern) - **定义**: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 ...
7. Array size too large(数组太大):定义的数组太大,超过了可用内存空间。 处理方法:检查数组的大小是否超过了可用内存空间。 8. Assembler statement too long(汇编语句太长):内部汇编语句最长不能超过...
Array size too large (数组太大)** - **错误描述**:定义的数组大小超出了系统可分配的内存范围。 - **解决方法**: - 减小数组大小。 - 考虑使用动态内存分配技术。 **8. Assembler statement too long (汇编...
- **Internal Assembler Error** (内部汇编器错误): 汇编器自身出现了错误,可能是因为软件缺陷或资源限制。 #### 3. **File and Symbol Handling Errors** - **missing source filename** (缺少源文件名): 编译时...
- **battlement**:城垛式的,虽然这个词汇在此上下文中似乎不太适用,但在某些特殊情况下可能用于描述不规则的表面或结构。 - **biography**:虽然这个词本身与计算流体力学无关,但在这里可能是指对某项技术或研究...
想要建立一个可以复用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。 - **优点**: 可以让任何两个没有关联的类一起运行;复用了现有的类,整体结构相对简单。 - **缺点**: ...
7. **数组长度太大**:定义的数组超出了可用内存的限制,尝试减小数组大小。 8. **汇编语句太长**:内部汇编语句超过480字节限制,考虑拆分语句或优化代码。 9. **配置文件不正确**:`RURBOC.CFG`配置文件中的选项...
- 样方面积需适中,太大或太小都会影响结果的准确性。最小样方面积可通过巢式扩展法确定,即逐步扩大样方面积直到新种类不再出现。 - 经验值如:草本植物群落1-10m²,灌丛16-100m²,针叶林100m²,混交林500m²...
- 内部因素:企业发展战略、管理激励、企业文化。 - 外部因素:社会文化、时代特点、国家政策、信息社会。 7. **组织结构设计**: - 组织结构应具备目标、分工合作及权力责任制度。 - 组织设计面对管理对象复杂...
结构型模式涉及如何组合类或对象以形成更大的结构。这些模式关注于对象的组合,使得复杂的功能可以通过简单的方式来实现。 #### 2.1 Bridge模式 - **定义**:将抽象部分与它的实现部分分离,使它们都可以独立变化...
3. PO102 输入数据过大:输入的数据超过了变量或数据类型的容量限制。 4. PO103 非法的PC编号:PC编号是指控制器编号,输入的编号不在合法范围内。 5. PO104 非法的机器人编号:机器人编号不正确,可能是输入错误...
1. 微带天线:利用薄金属片在介质基板上形成天线结构,体积小,适合集成到设备内部。 2. 带状线天线:利用导体带和接地平面之间的电磁场传播,适用于宽频带应用。 3. 蕾形天线:通过折叠馈线形成,具有良好的方向性...
- **缺点**:消耗内存资源,如果类的成员变量太多,会占用比较大的内存。 ##### 3.6 Mediator模式 **定义**:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且...
- **数组大小太大**:如果定义的数组超过了可用内存的限制,编译器会报错。需要减少数组的大小或优化内存使用。 - **汇编语句太长**:内联汇编语句的长度超过了480字节的限制,需要拆分或简化该语句。 - **配置...
缺点是给请求的处理增加了复杂性,并且如果链太长,将可能导致请求的处理效率降低。 19. **中介者模式(Mediator)** - **概念**:用一个中介对象来封装一系列的对象交互。 - **应用场景**:对象之间存在复杂的...