NI LabVIEW,CVI,数据采集等产品讨论区

cancel
Showing results for 
Search instead for 
Did you mean: 

LabVIEW调用返回结构体数组的dll时出错

Solved!
Go to solution

请教各位大神一个问题,现有这样一个dll,其代码如下:

typedef struct {
double DBL;
int INT;
} TD2;

_declspec(dllexport) void CLUSTERArray(TD2 *input, TD2 *output[2])
{

output[0]->DBL = input->DBL * input->DBL;
output[1]->DBL = input->DBL * input->DBL;
output[0]->INT = input->INT * input->INT;
output[1]->INT = input->INT * input->INT;

}

当我使用LabVIEW进行调用时出错(采用了两种方式分配返回参数的内存均报错),LabVIEW调用方式如下:

QQ截图20170619134923.png

 QQ截图20170619135147.png

QQ截图20170619135141.png

 

 

0 Kudos
Message 1 of 11
(2,237 Views)

如果函数原型是像下面这样写的话是可以成功调用的

typedef struct {
double DBL;
int INT;
} TD2;
_declspec(dllexport) void CLUSTERArray(TD2 *input, TD2 *output)
{

output->DBL = input->DBL * input->DBL;
output->INT = input->INT * input->INT;
}

0 Kudos
Message 2 of 11
(2,234 Views)

Try:

_declspec(dllexport) void CLUSTERArray(TD2 input, TD2 *output1, TD2 *output2)

 

Use "External C" to avoid function name mangling.

 

0 Kudos
Message 3 of 11
(2,197 Views)

感谢你的回复。你说的这种方式是可以的,但是实际应用中我要返回的数组长度可能会比较长,这种方式不够灵活,我还是想尝试下返回数组。

0 Kudos
Message 4 of 11
(2,189 Views)

_declspec(dllexport) void CLUSTERArray(TD2 *input, TD2 *output) 就行了.  不需要[2]

 

0 Kudos
Message 5 of 11
(2,181 Views)

_declspec(dllexport) void CLUSTERArray(TD2 *input, TD2 *output[2])/*如果这里的[2]不要了,那我下面的函数主体里该怎么写才能体现output是个数组呢*/

{ output[0]->DBL = input->DBL * input->DBL;

  output[1]->DBL = input->DBL * input->DBL;

  output[0]->INT = input->INT * input->INT;

  output[1]->INT = input->INT * input->INT;

}

0 Kudos
Message 6 of 11
(2,180 Views)
Solution
Accepted by topic author allen.li

TD2 *output is a pointer, pointing to a TD2 type data.  Same for one or array.

You can use TD2 *output, or use TD2 output[2].

 

 

0 Kudos
Message 7 of 11
(2,162 Views)

函数改为下面这种方式后,调用Dll不在报内存错误,但是返回的output数组只有第一个元素是对的,如下图所示。

_declspec(dllexport) void CLUSTERArray(TD2 *input, TD2 output[2])
{

output[0].DBL = input->DBL * input->DBL;
output[1].DBL = input->DBL * input->DBL;

output[0].INT = input->INT * input->INT;
output[1].INT = input->INT * input->INT;

}

QQ截图20170621100319.png

0 Kudos
Message 8 of 11
(2,156 Views)

The 2nd parameter is an array, not cluster!

 

 

0 Kudos
Message 9 of 11
(2,149 Views)

请问你这个最后是怎么解决的!我这也有一个调整DLL结构体,想请你指导指导!

0 Kudos
Message 10 of 11
(179 Views)