调用labview生成的dll文件中包含 labview的2维数组作为输出输出时,如何操作

发布时间 2023-11-26 21:36:26作者: Nichoooolas

以前使用 python 调用 labview 生成的dll时,如果直接使用labview本身的二维数组,程序就会自己崩溃,也无法使用,但由于二维本质就是一维,所以用的一维加行列可以解决这个问题,绕开了这个labview二维数组的结构
但是最近有研究了一下,发现可以解决这个问题,现在记录如下,

首先,从网上找到了一些参考


typedef struct {
	int32_t dimSizes[2];
	double element[1];
} DoubleArrayBase;
typedef DoubleArrayBase **DoubleArray;

DoubleArray __cdecl AllocateDoubleArray (int32_t *dimSizeArr);
MgErr __cdecl DeAllocateDoubleArray (DoubleArray *hdlPtr);


// In your code
#include "mydll.h"

int main()
{
	// Allocate and write the input array
	int32_t datasz[2] = {2, 3};
	DoubleArray arrayIn = AllocateDoubleArray(datasz);
	(*arrayIn)->element[0] = 1;
	(*arrayIn)->element[1] = 2;
	(*arrayIn)->element[2] = 3;
	(*arrayIn)->element[3] = 11;
	(*arrayIn)->element[4] = 12;
	(*arrayIn)->element[5] = 13;

	// Call your function
	DoubleArray arrayOut;  // 这里后面会说,需要修改下~
	Linear_discrim_4dll(&arrayIn, &arrayOut, 2, 3);

	// Extract data from the output array, ASSUMING the output is 2x2
	double cArray[2][2];
	cArray[0][0] = (*arrayOut)->element[0];
	cArray[0][1] = (*arrayOut)->element[1];
	cArray[1][0] = (*arrayOut)->element[2];
	cArray[1][1] = (*arrayOut)->element[3];

	// Free the input array's memory
	DeAllocateDoubleArray(&arrayIn);

基本是这个思路,但是我在处理过程中,发现,需要把

DoubleArray arrayOut = AllocateDoubleArray(datasz);

就是输出的二维数组对象,也需要先 allocate 一下,先申请一下内存,要不也会崩溃。

另外,在clion中使用cmake时,labview自带的库无法编译会报错使用找不到对应的 compiler,用的viusal studio 进行的编译成功
typedef struct {
int32_t dimSizes[2];
double Numeric[1]; //我的结构体重是 Numeric,不是element
} DoubleArrayBase;

参考:
https://lavag.org/topic/20486-lv-dll-creates-mysterious-doublearray-class/