关于labview传入参数到DLL结构体
有人问为什么往DLL的结构体传入簇不行?这里面涉及到内存对齐知识
在C中结构体对齐原则如下:
1.结构体变量的起始地址能够被其最宽的成员大小整除
2.结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
3.结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节
C/C++程序内存对齐跟编译器有关,一般是8或者4字节对齐,也可以自行设定
然而labview中簇内存是连续的,也就是单字节对齐
labview传入的参数要跟DLL的结构体参数对齐,这样才能正确调用
定义一个简单的结构体:
加入预编译命令#pragma pack(1),打印结构体的信息如下:
加入预编译命令#pragma pack(8),打印结构体的信息如下:
为什么多了四个字节?请参考上面的对齐原则,在int后面补充了4个字节
下面以labview代码测试:
void test(char* msg, student *stuinfo);//DLL函数
功能:传入结构体,返回学生信息
首先按照一般方式去操作,如下图:
无法返回正确的结果,原因是内存没有对齐
更改labview代码,测试DLL中预设单字节对齐方式:
可以正确的传入参数,并且返回结果
测试DLL中预设8字节对齐方式:
可以正确的传入参数,并且返回结果
如果结构体只包含int,double,bool这些类型就更容易处理了,这就不讲了
结论:labview给DLL中结构体传入参数,要保证字节对齐
下面是注意事项,很关键:
labview中层次结构数据类型(例如,簇)中的数组和字符串始终包括大小信息。
所以簇内存中包含字符串的大小,要把这个去掉,如果不包含字符串就不用处理
结构体的字节对齐对于跨语言不同编译器传参时尤为重要
注意大小端
赞 (0)