Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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
C++;数组到Numpy,SWIG问题,TypeError 我正在研究在Python中调用C++库的Sug。一个问题是,当我在C++中使用一维数组,并想用python调用它作为Numpy arrary时,我得到了错误。p>_Python_C++_Swig - Fatal编程技术网

C++;数组到Numpy,SWIG问题,TypeError 我正在研究在Python中调用C++库的Sug。一个问题是,当我在C++中使用一维数组,并想用python调用它作为Numpy arrary时,我得到了错误。p>

C++;数组到Numpy,SWIG问题,TypeError 我正在研究在Python中调用C++库的Sug。一个问题是,当我在C++中使用一维数组,并想用python调用它作为Numpy arrary时,我得到了错误。p>,python,c++,swig,Python,C++,Swig,头文件:example.h #include <iostream> using namespace std; class Example { public: void say_hello(); void add(int x, int y, int *result); int sub(int *x, int *y); void array_add(int *a, int *b, int *c); }; 安装文件:Setup.py #!/usr/bin/env py

头文件:example.h

#include <iostream>
using namespace std;
class Example {
  public:
  void say_hello();
  void add(int x, int y, int *result);
  int sub(int *x, int *y);
  void array_add(int *a, int *b, int *c);
};
安装文件:Setup.py

#!/usr/bin/env python

from distutils.core import setup, Extension
import numpy
import os

example_module = Extension('_example',
    sources=['example.cpp', 'example_wrap.cxx',],
)
setup (
    name = 'example',
    version = '0.1',
    author = "Frank Tang",
    description = """Simple swig C\+\+/Python example""",
    ext_modules = [example_module],
    py_modules = ["example"],
)
文件:test_example.py

在运行“python test_example.py”之后,我得到了如下错误消息。我使用macOS

(virtualenv) bogon:source tangsg$ python test_example.py 
Hello Example.
7
3
Traceback (most recent call last):
  File "test_example.py", line 18, in <module>
    example.Example().array_add(a, b, c)
  File "/Users/tangsg/Projects/test/source/example.py", line 115, in 
array_add
    return _example.Example_array_add(self, a, b, c)
TypeError: in method 'Example_array_add', argument 2 of type 'int *'
(virtualenv) bogon:source tangsg$ ›
(virtualenv)bogon:source tangsg$python test\u example.py
你好,例子。
7.
3.
回溯(最近一次呼叫最后一次):
文件“test_example.py”,第18行,在
example.example().array_add(a、b、c)
文件“/Users/tangsg/Projects/test/source/example.py”,第115行,在
数组添加
返回\u示例。示例\u数组\u添加(self、a、b、c)
TypeError:在“Example\u array\u add”方法中,参数2的类型为“int*”
(virtualenv)bogon:source tangsg$›

您的类型映射和
数组添加
函数的声明无效。NUMPY数组总是有大小,这必须被传递给C++。有相当广泛的文档可供使用

还有两件事:

  • add
    sub
    的函数签名效率低下。不要使用笨拙的指针参数,只需按值调用并返回一个值,即

    intadd(intx,inty){返回x+y;}
    intsub(intx,inty){返回x-y;}
    
    然后还可以删除
    %applyint*输出{int*结果}
    %应用int*输入{int*x,int*y}从接口文件

  • 永远不要使用名称空间标准
    在头文件中!()


示例.h

#包括
#包括
课例{
公众:
空数组添加(int*a,int len_a,int*b,int len_b,int*c,int len_c){
int const end=std::min(len_a,std::min(len_b,len_c));
对于(int i=0;i
示例.i

%模块示例
%{
#使用_INIT定义SWIG_文件
#包括“example.h”
%}
%包括“numpy.i”
%初始%{
导入数组();
%}
%应用(int*IN_ARRAY1,int DIM1){(int*a,int len_a),(int*b,int len_b)};
%应用(int*INPLACE_ARRAY1,int DIM1){(int*c,int len_c)};
%包括“example.h”
test.py

导入示例
将numpy作为np导入
E=示例。示例()
a=np.array([1,1],dtype=np.int32)
b=np.array([1,1],dtype=np.int32)
c=np.array([1,1],dtype=np.int32)
E.数组_添加(a、b、c)
印刷品(c)
调用示例:

$swig-python-c++示例.i
$clang++-Wall-Wextra-Wpedantic-I/usr/include/python2.7-fPIC-sharedexample\u wrap.cxx-o\u example.so-lpython2.7
$python test.py
[2 2]

请编辑您的问题并以文本形式添加错误消息,而不是以图像形式添加错误消息以文本形式添加错误消息
array\u add
如何知道这些数组的长度?现在就可以了。谢谢
#!/usr/bin/env python

from distutils.core import setup, Extension
import numpy
import os

example_module = Extension('_example',
    sources=['example.cpp', 'example_wrap.cxx',],
)
setup (
    name = 'example',
    version = '0.1',
    author = "Frank Tang",
    description = """Simple swig C\+\+/Python example""",
    ext_modules = [example_module],
    py_modules = ["example"],
)
(virtualenv) bogon:source tangsg$ python test_example.py 
Hello Example.
7
3
Traceback (most recent call last):
  File "test_example.py", line 18, in <module>
    example.Example().array_add(a, b, c)
  File "/Users/tangsg/Projects/test/source/example.py", line 115, in 
array_add
    return _example.Example_array_add(self, a, b, c)
TypeError: in method 'Example_array_add', argument 2 of type 'int *'
(virtualenv) bogon:source tangsg$ ›