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来代替
分享到:
相关推荐
● 软件具有“复杂性”,其开发和运行常受到计算机系统的限制。 2. 软件发展有几个阶段?各有何特征? 答: ① 程序设计阶段。 硬件特征:价格贵、存储容量小、运行可靠性差。 软件特征:只有程序、程序设计...
汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两 种情况分开进行。 设计模式之 Prototype(原型) 用原型实例指定创建对象的种类,并且通过拷贝这些...
(2)虚存容量还受计算机总线地址结构限制; (3)速度和容量的“时空”矛盾,虛存量的“扩大”是以牺牲CPU工作时间以及内外存交换时间为代价的。 •存储管理的目的及功能 目的是方便用户,提高内存...
CI 把内部的复杂部分悄悄地完成了,举例来说,实现了列举近百种不同附件的 MIME 类型的功能。所以它知道你的相片 photo1.jpg 是一个“image/jpeg”MIME 类型。因此它在你附件的适当位置填写必要的限制符号,它处理...
了解 DriveRack复杂的程序能力的第一步,就是要知道包括其组成成分在内的因素,以定义一个完整的“程序"。一个独立的程序是由几个编辑层组成的。最初进入一个程序时,会处于“程序"方式层。此层为用户提供了当前...
可能是一个包含注册表数据文件的结构已损坏,也可能内存中该文件的系统映像已损坏,或者因为备份副本(或日志)不存在(或损坏)导致无法恢复该文件。 1016 由注册表引起的 I/O 操作发生了不可恢复的错误。...
其次是存取,查阅的问题,随着档案的不断增加,要从如此复杂的档案库中调阅某学生的档案所消耗的人力物力是无法估量的,而且学生档案本身就很复杂,要查阅或者修改其中的某一项值,其修改的冗余度太大。最后是 一个...
9.2.1 静态变量:函数内部的追踪 334 9.2.2 在函数之间共享变量 336 9.3 调用自己的函数:递归 338 9.4 变元个数可变的函数 341 9.4.1 复制va_list 344 9.4.2 长度可变的变元列表的基本规则 344 9.5 main()...
C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言...
也许开始和最终根本就不 是一个样子,也许开始想象的功能最后没有实现,也许界面完全变化,也许整个程序的内部到最后 都发生了很大的变化,但这就是一个程序成长的过程。而这个过程会在很大程度上让初学者看到一个 ...
百,十,个,由于数码管个数多,如采用静态显示方式,则占用单片机的I/O口线太多,如果用定时器/计数器的串行移位寄存器工作方式及外接串入并出移位寄存器74LS164的方式,则电路复杂。所以,在数码管个数较多时,常...
校园网基本拓扑结构 由于校园网络的拓扑结构比较大,我们在这里并没有详细勾勒出每个细节,只是把校园 网络的基本结构勾画出来。下图是一个校园网的基本网络拓扑: 拓扑图中的路由器、防火墙和核心交换机构成了校园...
网络的安全仍然存在很大隐患,这些安全隐患主要可以归结为以下几点: 1.1 每一种安全机制都有一定的应用范围和应用环境 防火墙是一种有效的安全工具,它可以隐蔽内部网络结构,限制外部网络到内部网络的访问。...
电源线或电源内部产生的干扰,它是通过电源线或电源内的部件耦 合或直接传导,可通过电源滤波、隔离等措施来衰减该类干扰。 内因:振荡源的稳定性,主要由起振时间频率稳定度和占空比稳定度决定 起振时间可由电路...
《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
校园网基本拓扑结构 由于校园网络的拓扑结构比较大,我们在这里并没有详细勾勒出每个细节,只是把校园 网络的基本结构勾画出来。下图是一个校园网的基本网络拓扑: 简单的校园网设计方案全文共8页,当前为第1页。 ...
命令行参数在使用时颇为复杂,不过我们可以制作批处理文件,从而“一劳永逸”(类似于无人安装 Windows 98 和Windows 2000)。现在让我们来了解一些常用的参数(了解更加详细的参数介绍可查看 Ghost 的帮助文件)。 ...
命令行参数在使用时颇为复杂,不过我们可以制作批处理文件,从而“一劳永逸”(类似于无人安装 Windows 98 和Windows 2000)。现在让我们来了解一些常用的参数(了解更加详细的参数介绍可查看 Ghost 的帮助文件)。 ...
4.7 我有些解析外部结构的代码,但是它却崩溃了,显示出了“unalignedaccess”(未对齐的访问)的信息。这是什么意思? 作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:voidf(int*ip){...