我正在为以下问题而苦苦挣扎,我想这对具有更高C语言技能的人来说并没有那么复杂。
我的意图是从Python访问存储在DLL中的C ++函数。 我设法使它运行以实现简单的功能,例如ADD和MULT。
由于我想访问的功能(稍后)将返回多个浮点值,因此需要使用指针。
我想执行以下基本步骤:
-在python中创建变量,
-将指针转移到dll(ctypes-> c_pointer(...)),
-更新指针所指向的值;
-返回python并使用修改后的值。
我用于dll创建的C ++函数是:
#include <stdio.h>
#include <wchar.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <fstream>
using namespace::std;
extern "C" {
__declspec(dllexport)
int Kappel(double a, double *f){
*f = 25.5;
return 0;
}
} // extern "C"
我在dll中调用该函数的python代码如下:
import os
import os.path
import ctypes
from ctypes import pointer,c_long,c_int,c_double
lib_path=os.path.dirname(os.path.abspath(__file__))+os.path.sep+'test.dll'
lib = ctypes.CDLL(lib_path)
lib.Kappel.resttype = pointer(c_double())
p = 1.5
Cp = c_double(1.5)
Cp_ = pointer(c_double(p))
def test3(wert, zeiger):
func = lib.Kappel
Res = func(wert, zeiger)
return Res
#Output after modification
print('Returnvalue: ', test3(Cp,Cp_))
print(p)
print(Cp)
print(Cp_)
感谢您的帮助 埃里克
答案 0 :(得分:1)
几分钟前解决了该问题。 就像想象中一样简单...
不起作用:
p = 1.5
Cp = c_double(p)
Cp_ = pointer(c_double(p))
作品:
p = 1.5
Cp = c_double(p)
Cp_ = pointer(Cp)
答案 1 :(得分:0)
ctypes
具有byref
,这是您想要执行的操作的首选方式:
# Given: int Kappel(double a, double *f)
lib.Kappel.argtypes = c_double,POINTER(c_double)
lib.Kappel.restype = c_int
out = c_double() # Create instance of a C type to pass by reference.
lib.Kappel(1.5,byref(out))
print(out.value) # Retrieve the value.