用 SWIG 覆盖字符(或 std::string)数组位置



我能够用 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和双精度数组的指针,并且效果很好。

但问题是,我已经尝试了同样的想法 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 *'。可以用字符/字符串做同样的事情吗?

    .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**来做到这一点吗?提前感谢!

use 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 文件中。

请注意,您不需要外部 C 限定符。你应该使用#include <string>而不是string.h。

最新更新