`
tcspecial
  • 浏览: 913935 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • 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来代替

 

分享到:
评论

相关推荐

    第6讲 交换机与VLAN:办公室太复杂,我要回学校1

    - **提高安全性**:VLAN可以限制不同部门或区域之间的通信,提供一定的安全隔离。 - **简化管理**:通过VLAN,管理员可以更方便地管理和控制网络流量,提升网络效率。 6. **VLAN间的通信**: - **路由器的作用**...

    36源码 4:风驰电掣 —— 探索「快速列表」内部(1).md

    但随着使用,发现链表的附加空间太高,内存碎片化问题也较为严重,因此Redis开发者们对列表数据结构进行了改造。 ### 知识点二:quicklist数据结构的出现 Redis的后续版本中,开发者用quicklist代替了ziplist和...

    内部类的理解Java系列2021.pdf

    - 静态内部类可以在内部声明静态字段或方法,但这样做并没有太大的意义,因为静态内部类本质上是一个独立的类。 3. 内部类的访问规则 - 非静态内部类可以无限制地访问外部类的所有成员,包括私有成员。 - 静态内部...

    模具结构基础知识.pptx

    尽管级进模结构复杂,成本较高,但它们在大批量生产中显示出无可比拟的优势,特别是对于生产率和模具强度的要求高于单工序和复合模。 除了模具的总体结构外,冲裁模的工作零件设计同样重要,尤其是凸模的设计。整体...

    24种设计模式介绍与6大设计原则

    - **缺点**: 结构复杂,可能导致大量的类。 16. **观察者模式** (Observer Pattern) - **定义**: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 ...

    C语言错误种类总结.pdf

    7. Array size too large(数组太大):定义的数组太大,超过了可用内存空间。 处理方法:检查数组的大小是否超过了可用内存空间。 8. Assembler statement too long(汇编语句太长):内部汇编语句最长不能超过...

    C语言常见编辑错误信息表

    Array size too large (数组太大)** - **错误描述**:定义的数组大小超出了系统可分配的内存范围。 - **解决方法**: - 减小数组大小。 - 考虑使用动态内存分配技术。 **8. Assembler statement too long (汇编...

    汇编语言编程常见错误中英文对照(网上找的)

    - **Internal Assembler Error** (内部汇编器错误): 汇编器自身出现了错误,可能是因为软件缺陷或资源限制。 #### 3. **File and Symbol Handling Errors** - **missing source filename** (缺少源文件名): 编译时...

    CFD英语学习资料 CFD English learning

    - **battlement**:城垛式的,虽然这个词汇在此上下文中似乎不太适用,但在某些特殊情况下可能用于描述不规则的表面或结构。 - **biography**:虽然这个词本身与计算流体力学无关,但在这里可能是指对某项技术或研究...

    设计模式解析

    想要建立一个可以复用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。 - **优点**: 可以让任何两个没有关联的类一起运行;复用了现有的类,整体结构相对简单。 - **缺点**: ...

    Turbo c出错提示信息中文翻译(word版)

    7. **数组长度太大**:定义的数组超出了可用内存的限制,尝试减小数组大小。 8. **汇编语句太长**:内部汇编语句超过480字节限制,考虑拆分语句或优化代码。 9. **配置文件不正确**:`RURBOC.CFG`配置文件中的选项...

    植物群落的调查与分析报告文案.doc

    - 样方面积需适中,太大或太小都会影响结果的准确性。最小样方面积可通过巢式扩展法确定,即逐步扩大样方面积直到新种类不再出现。 - 经验值如:草本植物群落1-10m²,灌丛16-100m²,针叶林100m²,混交林500m²...

    人力资源开发管理.pptx

    - 内部因素:企业发展战略、管理激励、企业文化。 - 外部因素:社会文化、时代特点、国家政策、信息社会。 7. **组织结构设计**: - 组织结构应具备目标、分工合作及权力责任制度。 - 组织设计面对管理对象复杂...

    c++设计模式 设计模式精解-GoF 23种设计模式解析附C++实现源码

    结构型模式涉及如何组合类或对象以形成更大的结构。这些模式关注于对象的组合,使得复杂的功能可以通过简单的方式来实现。 #### 2.1 Bridge模式 - **定义**:将抽象部分与它的实现部分分离,使它们都可以独立变化...

    川崎机器人报警代码.pdf

    3. PO102 输入数据过大:输入的数据超过了变量或数据类型的容量限制。 4. PO103 非法的PC编号:PC编号是指控制器编号,输入的编号不在合法范围内。 5. PO104 非法的机器人编号:机器人编号不正确,可能是输入错误...

    电信设备-无线通信终端的内置型天线组件.zip

    1. 微带天线:利用薄金属片在介质基板上形成天线结构,体积小,适合集成到设备内部。 2. 带状线天线:利用导体带和接地平面之间的电磁场传播,适用于宽频带应用。 3. 蕾形天线:通过折叠馈线形成,具有良好的方向性...

    c++23种设计模式,经典之作

    - **缺点**:消耗内存资源,如果类的成员变量太多,会占用比较大的内存。 ##### 3.6 Mediator模式 **定义**:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且...

    C语言编译出错信息详解

    - **数组大小太大**:如果定义的数组超过了可用内存的限制,编译器会报错。需要减少数组的大小或优化内存使用。 - **汇编语句太长**:内联汇编语句的长度超过了480字节的限制,需要拆分或简化该语句。 - **配置...

    Java的23种设计模式

    缺点是给请求的处理增加了复杂性,并且如果链太长,将可能导致请求的处理效率降低。 19. **中介者模式(Mediator)** - **概念**:用一个中介对象来封装一系列的对象交互。 - **应用场景**:对象之间存在复杂的...

    软件工程-理论与实践(许家珆)习题答案

    ● 软件具有“复杂性”,其开发和运行常受到计算机系统的限制。 2. 软件发展有几个阶段?各有何特征? 答: ① 程序设计阶段。  硬件特征:价格贵、存储容量小、运行可靠性差。  软件特征:只有程序、程序设计...

Global site tag (gtag.js) - Google Analytics