将数组从python传递到共享DLL,查看访问冲突错误

时间:2016-07-19 12:10:45

标签: python ctypes

DLL中的C函数:

Multi(double Freq, double Power, int ports[], int Size)
Need to pass the 3rd parameter as an array from python 

尝试了以下不同的代码:

A:

import ctypes
pyarr = [2,3]
arr = (ctypes.c_int * len(pyarr))(*pyarr)

lp = CDLL(CDLL_file)
lp.Multi(c_double(Freq), c_double(Power), arr ,c_int(Size))`

此代码显示错误        ## exception ::访问冲突读取0x00000000000

B:

retarr = (ctypes.c_int*2)()
retarr[0] =2
retarr[1] =3

lp = CDLL(CDLL_file)
lp.Multi(c_double(Freq), c_double(Power), retarr ,c_int(Size))`

此代码显示错误

## exception :: access violation reading 0x00000000000 

C:使用ctypes.byref的相同代码也尝试了......

我的理解是函数需要一个数组作为参数, 尝试传递一个数组,如井地址。 两种情况都没有用 有没有人看到我的理解或其他任何错误来解决这个问题?

1 个答案:

答案 0 :(得分:1)

指定您的nx。鉴于此test.dll源:

argtypes

这有效:

#include <stdio.h>

__declspec(dllexport) void Multi(double Freq, double Power, int ports[], int Size)
{
    int i;
    printf("%f %f\n",Freq,Power);
    for(i = 0; i < Size; ++i)
        printf("%d\n",ports[i]);
}

输出:

from ctypes import *
dll = CDLL('test')
Multi = dll.Multi
Multi.argtypes = (c_double,c_double,POINTER(c_int),c_int)
Multi.restype = None

ports = (c_int * 2)(100,200)
Multi(1.1,2.2,ports,len(ports))