Python ctypes不使用结构

2024-10-02 00:42:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在Python中使用LabVIEW中的一些代码。LabVIEW代码用作DLL。所以,我在Python中使用ctypes库。在一个例子中,我需要将clusters从Python传递到LabVIEW。我正面临着通过集群的问题。在

问题在于LabVIEW集群中元素的特定顺序(我知道集群严格遵循顺序)。我的集群有一个double值和一个integer array。当double是集群中的第一个元素时,一切都很好。但是,当数组被设置为第一个元素并将double设置为第二个元素时,事情就根本不起作用了。我使用的是LabVIEW2015(32位)和Python3(32位)。在

我怀疑ctypes是这个问题的原因。因为,同一DLL在CLabVIEW中按预期工作。我也试过在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

LabVIEW code for Func1 func1的LabVIEW代码

LabVIEW code for Func2 func2的LabVIEW代码

有人面对过这个问题吗?在这种情况下该怎么办?在


Tags: 代码from集群arraydlldoubleclusterprintf

热门问题