Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python调用C DLL函数时出错_Python_C_Dll_Ctypes - Fatal编程技术网

从Python调用C DLL函数时出错

从Python调用C DLL函数时出错,python,c,dll,ctypes,Python,C,Dll,Ctypes,我试图执行我的Python代码,该代码必须调用一个C函数,该函数执行一些计算并将值保存在一个指针中,该指针必须可以从Python代码中访问。我想这样做是因为我正在构建一个DLL,我想验证DLL函数中的代数,因此我想使用python代码来验证DLL。 Python代码 from ctypes import * if __name__ == '__main__': mydll = cdll.LoadLibrary("./dll_simples.dll") funcao = my

我试图执行我的Python代码,该代码必须调用一个C函数,该函数执行一些计算并将值保存在一个指针中,该指针必须可以从Python代码中访问。我想这样做是因为我正在构建一个DLL,我想验证DLL函数中的代数,因此我想使用python代码来验证DLL。 Python代码

from ctypes import *


if __name__ == '__main__':

    mydll = cdll.LoadLibrary("./dll_simples.dll")
    funcao = mydll.simuser
    funcao.argtypes = c_double,c_double,POINTER(c_double),POINTER(c_double)



    a = 0
    b = 0
    input_1 = (c_double * 1)()
    input_1[0] = 5
    output_1  = (c_double * 1)()
    funcao(a,b,input_1,output_1)
还有我的DLL

__declspec(dllexport) void simuser(double t, double delt, double* in, double* out)
{



out[0] = 2 * in[0];



}
执行此代码后,我出现了错误

funcao(a,b,input_1,output_1)

OSError: exception: access violation reading 0x0000000000000018
上市

因此,您希望将数组传递给需要指针的函数。在这种情况下,需要ctypes.cast:

因此,不是:

funcao(a,b,输入1,输出1)
使用:

funcao(a,b,cast(输入_1,指针(c_double)),cast(输出_1,指针(c_double)))
看看现有的C代码,它只为2个指针使用一个值,在这种情况下,您根本不需要数组(但我怀疑这是目的,因为这样输入值就不应该是指针):

#。。。
输入_1=c_双(5)
输出_1=c_双精度(0)
funcao(a,b,byref(输入1),byref(输出1))

一个工作示例:.

只是一个粗略的猜测:您是否尝试过
funcao(A、b、byref(input\u 1)、byref(output\u 1))
出于某种原因需要python?为什么不从C测试并省去所有DLL的麻烦呢。如果你需要异常,那么使用C++或C语言。我尝试了这个方法,在简化代码中只使用了1个AgMuntIn真的DON;我不明白你说的话。你到底试了什么?有用吗?对不起。该评论无意中不完整。我想说的是,我尝试过你的方法,但没有成功。因此,我简化了代码,以便使用您的方法('cast'函数)仅使用1个指针数组。但我仍在努力使这段代码正常工作。我会在这里发布解决方案,当我找到它。我必须使用数组,因为在未来它将是一个数组,将被发送到一个C dll,它将计算一些东西,并保存在另一个数组(输出1)。对不起,你的答案是正确的。错误在我的C代码中。当我有Py_Initialize()时;在动态链接库中,什么都不起作用。当我从C代码调用DLL时,此DLL必须初始化一个Python解释器,该解释器工作正常,但当Python代码调用DLL时,它会出现错误“OSError:exception:access violation reading 0x0000000000000025”。