Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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/C++;as';浮动*';或';int*';_Python_C++_Python 3.x_Ctypes_Pybind11 - Fatal编程技术网

将python列表传递给C/C++;as';浮动*';或';int*';

将python列表传递给C/C++;as';浮动*';或';int*';,python,c++,python-3.x,ctypes,pybind11,Python,C++,Python 3.x,Ctypes,Pybind11,信用证++ void func(浮点*xyz1,浮点*xyz2,整数n){ //做点什么 对于(iTi=0;i可以用 cType < /Cord>实现。首先用C API创建共享对象。 cType < /C>不支持C++,但仅C。这意味着您可以在源代码中使用C++,但必须提供C接口,而不需要C++语言的特性,如函数重载或名称修改。ons标记为外部“C” 然后在python中加载共享对象。设置参数类型和结果类型。最后可以调用函数。下面是一个示例: import numpy as np n = 100

信用证++

void func(浮点*xyz1,浮点*xyz2,整数n){
//做点什么

对于(iTi=0;i可以用<代码> cType < /Cord>实现。首先用C API创建共享对象。<代码> cType < /C>不支持C++,但仅C。这意味着您可以在源代码中使用C++,但必须提供C接口,而不需要C++语言的特性,如函数重载或名称修改。ons标记为
外部“C”

然后在python中加载共享对象。设置参数类型和结果类型。最后可以调用函数。下面是一个示例:

import numpy as np
n = 1000000
xyz1 = np.random.random((n,)).tolist()
xyz2 = np.random.random((n,)).tolist()

#pass above array to the C/C++ code for further processing.
func(xyz1,xyz2,n) # <-- the call to the c/c++ code
DotProduct.h:

cmake_minimum_required (VERSION 3.5.1) 
project (DotProduct) 
set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_BUILD_TYPE Debug) 

add_library(DotProduct SHARED src/DotProduct.cpp src/DotProduct.h)
DotProduct.cpp:

extern "C" double dotProduct(double* l, double* r, unsigned int len);
main.py:

#include "DotProduct.h" 

double dotProduct(double *l, double *r, unsigned int len) { 
    double sum(0); 

    while (len--) { 
        sum += l[len] * r[len]; 
    } 
    return sum; 
}

在Python中执行C++代码,可以使用BooPython。->小点:在您的示例中,您声明了<代码> dotMudio>代码> C++函数,以获取未签名的int。但是在Python中,您声明它需要一个<代码> CINint < /Calp>(一个已签名int)。它应该是 CuuuNu>代码>。它也不会伤害到C链接和C++链接之间的功能的差异。我不知道OP是如何意识到的,而未来读者会意识到这一差别。谢谢托马斯,用你的例子,结合编译命令和“外部C”。我在这里读到的指令:,我能够让它工作。
extern "C" double dotProduct(double* l, double* r, unsigned int len);
#include "DotProduct.h" 

double dotProduct(double *l, double *r, unsigned int len) { 
    double sum(0); 

    while (len--) { 
        sum += l[len] * r[len]; 
    } 
    return sum; 
}
import ctypes

def dot_product(v1, v2):    
    l = len(v1)    
    if l != len(v2):        
        return 0    
    vec1 = (ctypes.c_double * l)(*v1)    
    vec2 = (ctypes.c_double * l)(*v2)    
    Dot_Product = ctypes.CDLL("build/lib/libDotProduct.so")      
    Dot_Product.dotProduct.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.c_uint]    
    Dot_Product.dotProduct.restype = ctypes.c_double
    return Dot_Product.dotProduct(vec1, vec2, l)

vec1 = [2, 2]
vec2 = [2, 3]
print("{} * {} = {}".format(vec1, vec2, dot_product(vec1, vec2)))