0
これは問題ではないかもしれませんが、ここにあります。私はSWIGを使用してpythonモジュールに3dベクトルをラップしました。すべてがコンパイルされており、モジュールをインポートしてアクションを実行できます。私はPythonで私のベクトルにアクセスして値を格納し変更する方法を理解できないようです。どのように私はPythonで私のベクトル値を格納し、変更するのですか?私のコードは以下の通りであり、アルゴリズムstlがSWIGで動作するかどうかテストするために書かれています。それは動作するように見えますが、私はPythonでベクトルに値を入れることができる必要があります。PythonでのSWIG C++のベクトルアクセス
がheader.h
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
#include <vector>
using namespace std;
struct myStruct{
int vecd1, vecd2, vecd3;
vector<vector<vector<double> > >vec3d;
void vecSizer();
void deleteDuplicates();
double vecSize();
void run();
};
#endif // HEADER_H_INCLUDED
main.cppに
#include "header.h"
#include <vector>
#include <algorithm>
void myStruct::vecSizer()
{
vec3d.resize(vecd1);
for(int i = 0; i < vec3d.size(); i++)
{
vec3d[i].resize(vecd2);
for(int j = 0; j < vec3d[i].size(); j++)
{
vec3d[i][j].resize(vecd3);
}
}
}
void myStruct::deleteDuplicates()
{
vector<vector<vector<double> > >::iterator it;
sort(vec3d.begin(),vec3d.end());
it = unique(vec3d.begin(),vec3d.end());
vec3d.resize(distance(vec3d.begin(), it));
}
double myStruct::vecSize()
{
return vec3d.size();
}
void myStruct::run()
{
vecSizer();
deleteDuplicates();
vecSize();
}
ターミナル(Ubuntuの)事前に
import test #import the SWIG generated module
x = test.myStruct() #create an instance of myStruct
x.vecSize() #run vecSize() should be 0 since vector dimensions are not initialized
0.0
x.vec3d #see if vec3d exists and is of the correct type
<Swig Object of type 'vector< vector< vector<double> > > *' at 0x7fe6a483c8d0>
感謝から!
興味深い。これは、ベクトルを値で返す場合にのみ当てはまります。参照またはポインタによってベクトルを返すときは、プロキシオブジェクトによってラップされます。ですから、 'x.vec3d'は代理オブジェクトであり、変更可能ですが、' x.vec3d [0] '等は不変のタプルです。 – m7thon
変更可能なswigオブジェクトを取得するための回避策はありますか? – phcerdan
@ m7thonそれは私には標準以外のsmart_pointersのstd :: vectorを返しています。 – phcerdan