我需要在Python
中使用LabVIEW
中的一些代码。LabVIEW
代码用作DLL
。所以,我在Python中使用ctypes
库。在一个例子中,我需要将cluster
s从Python传递到LabVIEW。我正面临着通过集群的问题。在
问题在于LabVIEW集群中元素的特定顺序(我知道集群严格遵循顺序)。我的集群有一个double
值和一个integer array
。当double是集群中的第一个元素时,一切都很好。但是,当数组被设置为第一个元素并将double设置为第二个元素时,事情就根本不起作用了。我使用的是LabVIEW2015(32位)和Python3(32位)。在
我怀疑ctypes
是这个问题的原因。因为,同一DLL在C
和LabVIEW
中按预期工作。我也试过在LabVIEW中使用DLL,效果很好。在
我把这个问题缩小到下面的例子。本例中的DLL有2个函数。每个函数使用一个集群。Func1
使用cluster1
,它是array
,后跟一个double
。而Func2
使用cluster
,它是double
,后跟{cluster
作为输入,只返回double
值作为输出(就像它来自输入集群一样)。在
在头文件中查找这些信息。在
typedef struct {
int32_t dimSize;
uint64_t elt[1];
} Uint64ArrayBase;
typedef Uint64ArrayBase **Uint64Array;
typedef struct {
double Double;
Uint64Array _1DArray;
} Cluster;
typedef struct {
Uint64Array _1DArray;
double Double;
} Cluster1;
/*!
* Func2
*/
double __cdecl Func2(Cluster *Double1DArrayCluster);
/*!
* Func1
*/
double __cdecl Func1(Cluster1 *_1DArrayDoubleCluster);
MgErr __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);
/*
* Memory Allocation/Resize/Deallocation APIs for type 'Uint64Array'
*/
Uint64Array __cdecl AllocateUint64Array (int32 elmtCount);
MgErr __cdecl ResizeUint64Array (Uint64Array *hdlPtr, int32 elmtCount);
MgErr __cdecl DeAllocateUint64Array (Uint64Array *hdlPtr);
这是我的python代码。在
^{pr2}$另外,C
代码。在
#include<stdio.h>
#include "DLL.h"
int main() {
double dbl = 45.54, result, result1;
int32 eltCount = 5, i;
// Use the API to allocate array
Uint64Array uia = AllocateUint64Array(eltCount);
// Populate the elts of the array
for (i = 0; i < (*uia)->dimSize; i++) {
(*uia)->elt[i] = (int)i;
}
// Create cluster instances
Cluster cluster = { dbl, uia };
Cluster1 cluster1 = { uia, dbl };
// Print for Debugging
printf("\nArray from cluster1{Array, DBL}: ");
for (i = 0; i < (*cluster1._1DArray)->dimSize; i++) {
printf("%llu, ", (*cluster1._1DArray)->elt[i]);
}
printf("\nArray from cluster{DBL, Array}: ");
for (i = 0; i < (*cluster._1DArray)->dimSize; i++) {
printf("%llu, ", (*cluster._1DArray)->elt[i]);
}
printf("\nDouble from cluster1{Array, DBL}: %lf", cluster1.Double);
printf("\nDouble from cluster{DBL, Array}: %lf", cluster.Double);
// Test the funcs
result = Func1(&cluster1);
result1 = Func2(&cluster);
printf("\n\nDouble output from DLL function cluster1{Array, DBL}: %lf", result);
printf("\nDouble output from DLL function cluster{DBL, Array}: %lf", result1);
return 0;
}
以下是Python
的输出,这不是预期的。45.54
必须由这两个函数作为输出返回。在
c:/Users/samkm/Desktop/DLL Demo/test.py
Array from arr_dbl_cluster: 0, 1, 2, 3, 4,
Array from dbl_arr_cluster: 0, 1, 2, 3, 4,
Double from arr_dbl_cluster: 45.54
Double from dbl_arr_cluster: 45.54
Double output from DLL function cluster{Array, DBL}: -2.106485661434095e-37 # int(...) -> 0
Double output from DLL function cluster{DBL, Array}: 45.54
并且C
代码返回预期的输出。在
Array from cluster1{Array, DBL}: 0, 1, 2, 3, 4,
Array from cluster{DBL, Array}: 0, 1, 2, 3, 4,
Double from cluster1{Array, DBL}: 45.540000
Double from cluster{DBL, Array}: 45.540000
Double output from DLL function cluster1{Array, DBL}: 45.540000
Double output from DLL function cluster{DBL, Array}: 45.540000
有人面对过这个问题吗?在这种情况下该怎么办?在
目前没有回答
相关问题 更多 >
编程相关推荐