我能够在C / C ++中编写一个void函数,并使用SWIG (int* INPLACE_ARRAY1, int DIM1)
包装到Python / Numpy,它接收int* vector
作为参数,对此向量进行一些数学运算,并覆盖结果在同一个向量上,这个结果可以在Python的对象中找到。如下:
extern "C" void soma_aloc(int* vetor, int tamanho)
{
int m = 0;
int* ponteiro = new int[tamanho];
for(m = 0; m < tamanho; m++)
{
ponteiro[m] = vetor[m];
};
for(m = 0; m < tamanho; m++)
{
ponteiro[m] = ponteiro[m] * 10;
};
for(m = 0; m < tamanho; m++)
{
vetor[m] = ponteiro[m];
};
delete [] ponteiro;
};
这是一个测试,学习如何使用typemaps (DATA_TYPE* INPLACE_ARRAY1, int DIM1)
和(DATA_TYPE* INPLACE_ARRAY2, int DIM1, int DIM2)
将指针包装到带有SWIG的int和double数组,并且运行良好。
但问题是,我用char / string Numpy向量(如向量vec1 = numpy.array(['a','a','a'])
或numpy.array(['a','a','a'],dtype=str)
尝试了相同的想法,并将每个位置更改为(['b','b','b'])
,但是Python显示in method 'vector_char2D', argument 1 of type 'char *'
。可以用char / string做同样的事情吗?
.cpp:
extern "C" void vetor_char2D(char* vetorchar, int tamanho_vetor)
{
for(int i = 0; i < tamanho_vetor; i++)
{
vetorchar[i] = 'b';
};
};
.i:
%module testestring
%include stl.i
%include std_string.i
%{
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#include <string>
#include <iostream>
#define SWIG_FILE_WITH_INIT
#include "testestring.hpp"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (char* INPLACE_ARRAY1, int DIM1) {(char* vetorchar, int tamanho_vetor)}
%include "testestring.hpp" (just the header of the above function vetor_char2D)
%clear (char* vetorchar, int tamanho_vetor);
我对SWIG的经历非常熟悉。可以使用char*
,char**
和/或std::string*/std::string**
执行此操作吗?提前谢谢!
答案 0 :(得分:0)
使用std :: vector:
void vetor_char2D(std::vector<std::string>& vetorchar)
{
for (int i = 0; i < vetorchar.size(); i++)
vetorchar[i] = "b";
};
清楚地表明可以修改向量,并且可以修改其中的字符串,并且STL向量和字符串的SWIG类型映射将很好地工作。注意字符串的双引号而不是单引号; Python只有字符串没有字符,所以没关系。你也可以使用char *等它,但它很少值得努力,上面更容易使用。如果您不想更改源,可以通过%inline指令将上述内容包含在.i文件中。
请注意,您不需要extern C限定符。你应该使用#include <string>
not string.h。