2017-09-13 4 views
2

値が関数func2にはfunc1から失われた後、メインますなぜ私は理解していません。それはfunc1でokを表示しますが、func2とmainでは失敗します。 私はそれがSWIG問題だとは思わない、C++コードの問題のような、より感触は〜あなたはコードの下で問題を再現することができます。失わ値

私TEST.CPP:

#include <string> 
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <sstream> 
#include <mutex> 
#include "test.h" 
void test::func1(float* feat) { 
    std::vector<float> fv = {1,2,3,4,5,6,7}; 
    feat = fv.data(); 
    for (std::size_t i = 0; i < 7; ++i){ 
    std::cout << *feat << std::endl; 
    feat++; 
    } 
} 


bool test::func2(float* feat) { 
    test::func1(feat); 
} 
bool test::main(float* feat){ 
    test::func2(feat); 
    for (std::size_t i = 0; i < 7; ++i){ 
    std::cout << *feat << std::endl; 
    feat++; 
    } 
} 

私TEST.H:

#include <string> 
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <sstream> 
#include <mutex> 

class test { 
public: 
    void func1(float* feat); 
    bool func2(float* feat); 
    bool main(float* feat); 
}; 

私test.i:

%module test 
%{ 
#define SWIG_FILE_WITH_INIT 
#include "test.h" 
%} 

%include "carrays.i" 
%array_functions(float, floatArray); 

%include <std_string.i> 
%include "test.h" 

私はのpython3でテスト:

>>> from test import test, new_floatArray, floatArray_getitem 
>>> import numpy as np 
>>> pp = test() 
>>> temp = new_floatArray(5) 
>>> pp.main(temp) 
1 
2 
3 
4 
5 
6 
7 
0 
0 
0 
0 
0 
4.02252e-14 
1.4013e-44 
False 

答えて

0
feat = fv.data(); 

この行は、featが指しているデータを変更しません。featのローカルバージョンが指すデータを変更します。

func2()から戻ると、featとそれが指しているデータのどちらも変更されません。あなたがメインに初期化されないデータを渡すので、あなたはどんなことを行っている初期化されていないデータの7点の版画、続く(独自のデータから)FUNC 1から7枚のプリントを取得します。

は、私はあなたが意味を疑う:

memcpy(feat, fv.data(), fv.size() * sizeof(float)); 

がどの featポイントにデータを fvからデータをコピーします。

+0

本当にありがとうございました!したがって、ポインタfloat *ポイントはローカルに留まり、スコープの外側には移動しません。 – ayy

+0

ポインタを値渡しするためです。いずれにしても、fvのデータの存続期間はfunc1の終わりまでしか延びません。参照によってポインタを渡し、fvのデータを指すようにポインタを変更した場合。それは不法なぶら下がりポインタになるでしょう。 – Frank

関連する問題