以前使用 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/