2017-09-13 5 views
2

값이 func1에서 func2로 손실 된 다음 main으로부터 왜 손실되는지 이해할 수 없습니다. 그것은 func1에서 ok를 인쇄하지만 func2와 main에서는 실패합니다. 나는 그것이 swig 문제라고 생각하지 않는다. C++ 코드와 같은 느낌이다. 아래 코드로 문제를 재현 할 수있다.함수 중 배열 포인터의 값이 손실 됨 (python3에서 사용하기 위해 swig로 컴파일 됨)

내 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); 
}; 

내 테스트 테스트 :

%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도 가리키는 데이터도 변경되지 않습니다. unitialized 데이터를 main에 전달하면 func 1 (자체 데이터에서)에서 7 장, 그 다음으로는 초기화되지 않은 데이터가 7 장 인쇄됩니다.

나는 당신이 의미 의심 :

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

가 어느 feat 지점에 데이터를 fv에서 데이터를 복사합니다.

+0

정말 고마워요! 따라서 포인터 float * points가 로컬에만 머물러 있으면 스코프 외부로 이동하지 않습니까? – ayy

+0

포인터를 값으로 전달했기 때문에. 어쨌든 fv의 데이터 수명은 func1의 끝까지 만 확장됩니다. 포인터를 참조로 전달한 다음 fv의 데이터를 가리 키도록 변경했습니다. 그것은 불법 인 매달려있는 포인터가 될 것입니다. – Frank