2016-05-19 12 views
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> 

感謝から!

答えて

0

ラッパー/インターフェイスが生成されたときに、ベクトルが不変のPythonオブジェクトに変換されることが判明しました。したがって、要するに、PythonからラップされたC++ベクタを変更することはできません。

+0

興味深い。これは、ベクトルを値で返す場合にのみ当てはまります。参照またはポインタによってベクトルを返すときは、プロキシオブジェクトによってラップされます。ですから、 'x.vec3d'は代理オブジェクトであり、変更可能ですが、' x.vec3d [0] '等は不変のタプルです。 – m7thon

+0

変更可能なswigオブジェクトを取得するための回避策はありますか? – phcerdan

+0

@ m7thonそれは私には標準以外のsmart_pointersのstd :: vectorを返しています。 – phcerdan

関連する問題